动态选择EntityFramework和System.Linq.Dynamic

时间:2013-06-27 01:55:35

标签: 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 =&gt; new {t,t.Nav1})

我试过。选择(“new(it,Nav1)”) 和。选择(“new(this,Nav1)”)

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

或等效的表达式构建语法也是一种选择。

注意:Nav Property ForSourceRecord仅在运行时已知,否则我将使用正常的lambda表达式。

1 个答案:

答案 0 :(得分:2)

使用匿名类型无法完成此操作。编译器只是没有工作所需的信息,特别是使用自由文本/字符串方法。

试试这个......

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");
}
相关问题