c# - 动态选择EntityFramework和System.Linq.Dynamic

标签 c# entity-framework lambda

我正在使用 DynamicQueryable.Select()//动态选择库

到目前为止我找到的唯一文档是System.Linq.Dynamic docu

我有一个匿名返回类型的查询,它可以工作。

var result = Context.Set<TPocoText>().Where((Expression<Func<TPocoText, bool>>) whereLambda)
                     .OrderByDescending(t => t.RowVersion).Skip(skip).Take(take)
                     .Select("new (m1,m2,Nav1) ");

这就像预期的那样select(t=> new {t.m1,t.m2,t.Nav1})

我的问题 它如何执行与 select(t=> new {t,t.Nav1}) 等效的操作

我尝试过 .Select("new (it,Nav1) ") 和 .Select("new (this,Nav1) ")

结果是未找到解析错误成员。 有人知道这个动态字符串解析API吗?

或者等效的表达式构建语法也是一个选项。

注意:ForSourceRecord 的 Nav 属性仅在运行时才知道,否则我将只使用普通的 lambda 表达式。

最佳答案

这不能使用匿名类型来完成。编译器只是没有工作所需的信息,尤其是使用自由文本/字符串方法。

试试这个...

var param = System.Linq.Expressions.Expression.Parameter(typeof(TPocoText));
var init = System.Linq.Expressions.Expression.MemberInit(
    System.Linq.Expressions.Expression.New(typeof(Foo)),
    new []{
        System.Linq.Expressions.Expression.Bind(GetMemberInfo((Foo f) => f.Nav), System.Linq.Expressions.Expression.PropertyOrField(param, "NameOfPropertyToBindToNav")),
        System.Linq.Expressions.Expression.Bind(GetMemberInfo((Foo f) => f.M1), System.Linq.Expressions.Expression.PropertyOrField(param, "M1")),
    }
);
var result = Context.Set<TPocoText>().Where((Expression<Func<TPocoText, bool>>) whereLambda)
                 .OrderByDescending(t => t.RowVersion).Skip(skip).Take(take)
                 .Select(System.Linq.Expressions.Expression.Lambda<Func<TPocoText, Foo>>(init, param));



public class Foo
{
    public string Nav {get;set;}
    public string M1 {get;set;}
}
public static MemberInfo GetMemberInfo<T, U>(Expression<Func<T, U>> expression)
{
    var member = expression.Body as MemberExpression;
    if (member != null)
        return member.Member;

    throw new ArgumentException("Expression is not a member access", "expression");
}

关于c# - 动态选择EntityFramework和System.Linq.Dynamic,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17333325/

相关文章:

c# - ajax工具包:TabContainer confirm when adding tab

c# - 与 Dropbox 一样,上传后在左下角的文件或文件夹图标上标记正确的符号

asp.net-mvc - 由于存在未决的更改,因此无法更新数据库以匹配当前模型

entity-framework - 何时使用包含在 EF 中?投影中不需要?

c# - Controller.Url.HttpRouteUrl() 生成带有 %amp 的错误查询字符串

c# - 继承中的逆变

kotlin - Lambda作为函数参数->仅接受来自特定类的方法

c# - 如何创建一个 Action<T> 形成一个通过反射给出的对象方法?

c++ - 如何在 Qt 中最好地存储动态创建的小部件的数据

c# - Azure AppInsight 日志信息不起作用