繁体   English   中英

Linq加入动态表达

[英]Linq Join with Dynamic Expression

我正在尝试在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 });

但是,这会在编译时抛出,即使lambda似乎是正确的语法,告诉我它无法从LambdaExpression转换为Expression<System.Func<E, int>>

如何使用我的字段动态创建正确的表达式(即上面的类型typeof(E).GetMember(Field).First())行中的属性“Field”?

使用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());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM