本文介绍了动态表达,entityframwork包括扩展的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
您好。
我有一个生成Entityframework的方法,包括来自对象的动态结构和构建如下所示的字符串:
Hi.
I have a method that generate Entityframework include dynamiclly from an object and build string that look like this:
"x=> x.Connectors , x=> x.BlockEntryFieldsGroup.Select(GhIm=> GhIm.BlockEntry_Field.Select(GhImcc=> GhImcc.BlockEntry_Value)) , x=> x.BlockEntryOffSet"
我希望将给定的字符串转换为params Expression> []包括现在我使用
and i would like to convert the given string to params Expression>[] includes right now i use
CSharpCodeProvider
来动态转换它。
有没有更好的方法来做到这一点而不使用
to dynamilcy convert it.
is there any better way to do this without using
CSharpCodeProvider
我的尝试:
这就是我现在所做的。
What I have tried:
this is what i do right now.
var searchValue = DynamicIncludeExpressionString(typeof(T), "x");
if (!searchValue.Any())
return source;
var func = "x=> " + string.Join(" , x=> ", searchValue);
var builder = new StringBuilder();
builder.Append("\r\nusing System;");
builder.Append("\r\nusing System.Collections.Generic;");
builder.Append("\r\nusing System.Linq;");
builder.Append("\r\nusing System.Reflection;");
builder.Append("\r\nusing SourceTech.Core.Interface;");
builder.Append("\r\nusing SourceTech.Core.ObjectLibrary;");
builder.Append("\r\nusing SourceTech.Core.Expression;");
builder.Append("\r\nnamespace DynamicLinqInclude");
builder.Append("\r\n{");
builder.Append("\r\npublic sealed class Dynamic_LinqInclude");
builder.Append("\r\n{");
builder.Append("\r\npublic static IQueryable<" + type.FullName + "> Execute<T>(IQueryable<" + type.FullName + "> source)");
builder.Append("\r\n{");
builder.Append("\r\n return source.IncludeEntitys(" + func + ");");
builder.Append("\r\n}");
builder.Append("\r\n}");
builder.Append("\r\n}");
var codeProvider = new CSharpCodeProvider();
var compilerParameters = new CompilerParameters
{
GenerateExecutable = false,
GenerateInMemory = false,
CompilerOptions = "/optimize"
};
compilerParameters.ReferencedAssemblies.Add("System.dll");
compilerParameters.ReferencedAssemblies.Add(typeof(System.Linq.IQueryable).Assembly.Location);
compilerParameters.ReferencedAssemblies.Add(typeof(System.Collections.IList).Assembly.Location);
compilerParameters.ReferencedAssemblies.Add(typeof(System.Linq.Enumerable).Assembly.Location);
compilerParameters.ReferencedAssemblies.Add(typeof(T).Assembly.Location);
string sourceCode = builder.ToString();
CompilerResults compilerResults = codeProvider.CompileAssemblyFromSource(compilerParameters, sourceCode);
Assembly assembly = compilerResults.CompiledAssembly;
Type types = assembly.GetType("DynamicLinqInclude.Dynamic_LinqInclude");
MethodInfo methodInfo = types.GetMethod("Execute");
methodInfo = methodInfo.MakeGenericMethod(type);
if (!DynamicLinqIncludeSources.ContainsKey(key)) // it may have been added by another threads
{
DynamicLinqIncludeSources.Add(key, methodInfo); // Save it in a temp instead of memory so we could choose to Clear it later.
DynamicLinqIncludeSourceLength++;
}
}
return (IQueryable<T>)DynamicLinqIncludeSources[key].Invoke(null, new object[] { source });
推荐答案
这篇关于动态表达,entityframwork包括扩展的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!