-->

LINQ的加入与动态表达(Linq Join with Dynamic Expression)

2019-10-18 23:48发布

我试图做在LINQ动态加入。 也就是说,我只知道在运行时哪些领域的加盟将发生在。

我已经做了以下情况:

var itemParam = Expression.Parameter(typeof(E), "obj");
var entityAccess = Expression.MakeMemberAccess(Expression.Parameter(typeof(E), "obj"), typeof(E).GetMember(Field).First());
var lambda = Expression.Lambda(entityAccess, itemParam);
var q = dbSet.Join(context.Acl, lambda, acl => acl.ObjectID, (entity, acl) => new { Entity = entity, ACL = acl });

然而,这将引发在编译时,即使拉姆达似乎是正确的语法告诉我,它不能从LambdaExpression转换为Expression<System.Func<E, int>>

我如何得到它来创建合适的表情是动态的(在IE属性“现场”上面使用我的领域typeof(E).GetMember(Field).First())行?

Answer 1:

使用Expression.Lambda<TDelegate>让你最终行

// obj => obj.Field
var lambda = Expression.Lambda<Func<E, int>>(entityAccess, itemParam);

更新

根据你的评论,表达失败的原因是因为使用的是两个不同的参数。 您可以定义itemParam ,但随后不使用它Expression.MakeMemberAccess

而不是尝试以下操作:

// obj
var itemParam = Expression.Parameter(typeof(E), "obj");

// obj.Field
var entityAccess = Expression.MakeMemberAccess(itemParam, typeof(E).GetMember(Field).First());


文章来源: Linq Join with Dynamic Expression