Динамическое выражение, entityframwork включают расширенное
Привет.
У меня есть метод, который генерирует Entityframework include dynamiclly из объекта и строит строку, которая выглядит следующим образом:
"x=> x.Connectors , x=> x.BlockEntryFieldsGroup.Select(GhIm=> GhIm.BlockEntry_Field.Select(GhImcc=> GhImcc.BlockEntry_Value)) , x=> x.BlockEntryOffSet"
и я хотел бы преобразовать данную строку в params Expression> [] includes прямо сейчас я использую
CSharpCodeProviderчтобы динамично преобразовать его.
есть ли лучший способ сделать это без использования
CSharpCodeProvider
Что я уже пробовал:
именно этим я сейчас и занимаюсь.
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 });