Alen Toma Ответов: 1

Динамическое выражение, 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 });

1 Ответов

Рейтинг:
1

Puresharper

Может быть, проще и чище обернуть IQueryable< t>, предоставляемый DbContext.Установите< t> () Вместо того, чтобы создавать строку для синтаксического анализа компилятором. Действительно,Вы можете воспользоваться этим преимуществом, используя дерево выражений, а не обязательный код.


Alen Toma

Ну что ж! не могли бы вы быть добры и привести пример, пожалуйста?