c# - IQueryable 表达式翻译

标签 c# linq entity-framework linq-expressions

我正在创建一个 IQueryable,我想将其用于传递给 Entity Framework 的查询。我的存储库不公开可查询。

 var query = new List<Entity>().AsQueryable().Where(x => x.Property == "argument");

我的存储库中有一个方法可以接收 IQueryable。

如何使用相同的可查询对象查询我的 DbSet?我正在尝试从可查询中提取表达式来为 dbset 构建一个新表达式。到目前为止,这是我所拥有的,但它不起作用:

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”

我显然没有正确构建表达式,我错过了什么?有没有更简单的方法来完成我想要完成的事情?

我还看到一些示例表明表达式应该具有参数属性。但无论我转换为哪种类型的表达式类型,这个是 ConstantExpression,我都没有看到 IQueryable.Expression 的参数属性。

最佳答案

在您的例子中,queryable.Expression 表示整个表达式 Queryable.Where(constantList, x => x.Property == "argument")。如果您只需要 Where() lambda,则需要提取它。为此,您可以使用如下代码:

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;
}

关于c# - IQueryable 表达式翻译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28355993/

相关文章:

c# - 使用 linq 反转 ObservableCollection<objectType>

c# - ^= 运算符到底是做什么的?

c# - JetBrains Rider - 配置应用程序设置覆盖

c# - 在 LINQ 中对 IEnumerable 进行排序

mysql - 更正此ERD这些部分的最有效方法是什么?

entity-framework - 如何获取 Entity Framework 查询的参数?

c# - ASP.NET Web Api 返回 XML 和获取 XML

c# - 使用 DotNetZip 从 zip 文件中提取特定文件夹

c# - 尝试使用 LINQ 连接对象名称时出现 "The element access is not permitted"错误

c# - 通用 Func<T,K> 对不同类型的集合进行排序