将多个lambda表达式传递给函数

时间:2014-02-14 13:48:53

标签: c# entity-framework lambda

我的项目中有一个genericRepository,其功能如下:

public virtual IEnumerable<TEntity> Get(
        Expression<Func<TEntity, bool>> filter = null,
        Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null)
    {
        IQueryable<TEntity> query = dbSet;

        if (filter != null)
        {
            query = query.Where(filter);
        }

        if (orderBy != null)
        {
            return orderBy(query).ToList();
        }
        else
        {
            return query.ToList();
        }
    }

如果我想获得仅由一个对象过滤的元素,这种方法很好。 在什么情况下我需要链接3-4 where子句? 有没有办法传递表达式数组,如果现在有什么最好的方法让这个东西工作?

在阅读了你的答案和评论后,我设法写了这个:

Expression<Func<Role, bool>> first = s => s.Id == 1;
Expression<Func<Role, bool>> second = s => s.RoleName != "null";
Expression<Func<Role, bool>> combined = Expression.Lambda<Func<Role, bool>>(Expression.And(first.Body, second.Body));

但是这给了我

  

附加信息:为lambda声明提供的参数数量不正确

2 个答案:

答案 0 :(得分:1)

我建议你使用LinqKit来构建调用此方法的表达式。

以下是一个例子:

  var predicate = PredicateBuilder.False<Product>();

  foreach (string keyword in keywords)
  {
    string temp = keyword;
    predicate = predicate.Or (p => p.Description.Contains (temp));
  }

  var products = productRepository.Get(predicate)

答案 1 :(得分:0)

可能你可以结合你的谓词

Combining Predicates