IQueryable表达式翻译 [英] IQueryable Expression Translation
问题描述
我正在创建一个IQueryable,我想用于传递给实体框架的查询。我的存储库不公开可查询。
I am creating an IQueryable that I want to use for a query passed to entity framework. My repository does not expose queryable.
var query = new List<Entity>().AsQueryable().Where(x => x.Property == "argument");
我的存储库中有一个方法,将使用IQueryable。
I have a method on my repository that will take in an IQueryable.
如何使用相同的查询查询我的DbSet?我试图从可查询中提取表达式以构建数据库的新表达式。这是我到目前为止,但它不起作用:
How do I query my DbSet with the same queryable? I am trying to extract the expression from the queryable to build a new expression for the dbset. Here is what I have so far but it does not work:
public IDbSet<TEntity> DbSet { get; set; }
public IEnumerable<TEntity> Find(IQueryable<TEntity> queryable)
{
var parameter = Expression.Parameter(typeof (TEntity));
var body = queryable.Expression;
var lambda = Expression.Lambda<Func<TEntity, bool>>(body, parameter);
var result = DbSet.Where(lambda);
return null;
}
当我尝试使用以下错误创建lambda时,代码失败:
类型'System.Linq.IQueryable`1 [MyTEntity]'的表达式不能用于返回类型'System.Boolean'
The code fails when I try and create the lambda with the following error: Expression of type 'System.Linq.IQueryable`1[MyTEntity]' cannot be used for return type 'System.Boolean'
我显然不是建立表达正确,我失踪了什么?有没有更简单的方法来做我想要完成的工作?
I'm clearly not building the expression correctly, what am I missing? Is there an easier way to do what I'm trying to accomplish?
另外我看到一些示例显示一个表达式应该有一个parameters属性。但是,无论我投给什么类型的表达式,而这一个是ConstantExpression,我看不到来自IQueryable.Expression的参数属性。
Also I've seen some examples that show an Expression should have a parameters property. But no matter what type of expression type I cast to, and this one is ConstantExpression, I don't see a parameters property from the IQueryable.Expression.
推荐答案
在你的情况下, queryable.Expression
表示整个表达式 Queryable.Where(constantList,x => x.Property ==参数)
。如果您只需要 Where()
lambda,则需要解压缩。为此,您可以使用如下代码:
In your case, queryable.Expression
represents the whole expression Queryable.Where(constantList, x => x.Property == "argument")
. If you want just the Where()
lambda, you need to extract it. To do that, you could use code like this:
public IEnumerable<TEntity> Find<TEntity>(IQueryable<TEntity> queryable)
{
var methodCall = queryable.Expression as MethodCallExpression;
Func<IQueryable<TEntity>, Expression<Func<TEntity,Boolean>>, IQueryable<TEntity>> whereDelegate = Queryable.Where;
if (methodCall.Method == whereDelegate.Method
&& methodCall.Arguments[0] is ConstantExpression)
{
var whereLambdaQuote = (UnaryExpression)methodCall.Arguments[1];
var whereLambda = (Expression<Func<TEntity, bool>>)whereLambdaQuote.Operand;
var result = DbSet.Where(whereLambda);
}
return null;
}
这篇关于IQueryable表达式翻译的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!