我正在尝试在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())
行上方的属性“字段”?
答案 0 :(得分:3)
使用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());