我想创建一个基于自己的id获取EntityFramework对象而不传入lambda表达式作为参数的方法GetById()
的通用方法。对于下面的代码,实体T
的类型为Message
,对GetById()
已实现的类已知,并且具有属性MessageId
以及其他几个属性。 MessageId
名称已在下面的示例中进行了硬编码,因为这仍然是实验性的 - 从T
中提取id属性名称在以后很容易修复。使用Func构建LambdaExpression <,>其中returnType是IQueryable <T>
我一直在努力寻找一种方法来构建一个简单的LambdaExpression
,其中IQueryable<T>
作为参数类型,并希望有人会有这样的线索可以完成。我想要IQueryable<T>
的原因是因为我的底层渠道工厂提供程序需要此更复杂的查询。
在下面的代码var exp = Expression.Lambda<...>
行示出了我想与落得表达式函数类型定义,但行给出了异常:
不能用于返回类型System.Boolean的表达键入IQueryable的
这是因为体内有Boolean
类型,而我的表情参数queryParamtRet
是IQueryable<Message>
类型。此外,如果我将主体类型更改为IQueryable<Message>
,我无法找到属性MessageId
,因为该类型不再输入T
,而是Message
,但输入的类型为IQueryable<T>
。
public T GetById(int id)
{
var queryParamLeft = Expression
.Parameter(typeof(System.Data.Entity.DbSet<T>), "o");
var queryParamRet = Expression
.Parameter(typeof(IQueryable<T>), "o");
var entityFrameworkType = Expression
.Parameter(typeof(T), "o");
var queryProperty = Expression
.PropertyOrField(entityFrameworkType, "MessageId");
var body = Expression
.Equal(queryProperty, Expression.Constant(id));
var exp = Expression
.Lambda<Func<System.Data.Entity.DbSet<T>, IQueryable<T>>>(
body,
queryParamRet);
var returnXml = DoWithChannel(channel
=> channel.Load(serializer.Serialize(exp)));
}
它看起来像你缺少的一步你表达式 - 如果它在c#中被编写为LINQ语句,它会是什么样子? 'dbSet.Where(o => o.MessageId == id)'也许? – Rhumborl
您错过了'Expression.Call(Queryable.Where,Expression.Lambda <...>)' – Aron