IQueryable表达式翻译 [英] IQueryable Expression Translation

查看:186
本文介绍了IQueryable表达式翻译的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在创建一个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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆