在where子句中组合两个LINQ条件

时间:2014-02-27 19:00:13

标签: c# .net linq c#-4.0

我有一个我在下面查询的集合。

this.Collection.AsQueryable().Where(x => x.FirstName = "FirstName" && x => x.LastName= "LastName");

现在基于布尔值,我想添加另一个&&条件到where子句。

我该怎么做呢?我尝试了下面的内容。

var firstExpr = x => x.FirstName = "FirstName" && x => x.LastName= "LastName";
var newExpr = firstExpr;
if (includeAge)
{
 Expression<Func<T, bool>> ageExpr = x => x.Age == 21;
 var combined = Expression.AndAlso(ageExpr.Body, firstExpr.Body);
 var newExpr = Expression.Lambda<Func<T, bool>>(combined);
}

this.this.Collection.AsQueryable().Where(newExpr);

但我得到一个异常 - System.ArgumentException:为lambda声明提供的参数数量不正确

4 个答案:

答案 0 :(得分:4)

如果这是内存收集,则没有理由转换为可查询:

IEnumerable<YourType> query = this.Collection.Where(x => x.FirstName = "FirstName" && x => x.LastName= "LastName");

if (includeAge)
    query = query.Where(x => x.Age == 21);

答案 1 :(得分:0)

var queryable = this.Collection.AsQueryable().Where(x => x.FirstName = "FirstName" && x => x.LastName= "LastName");

if (!includeAge)
{
    return queryable;
}

return queryable.Where(x => x.Age == 21);

答案 2 :(得分:0)

这是解决您问题的可能方法。

if (includeAge) {
  firstExpr = firstExpr.Where(n => n.Age == 21);
}

除非你想在newExpr中使用它...在这种情况下你可以将var newprpr保持在最顶层然后按上面的方式分配它。

答案 3 :(得分:0)

也许是这样的?

var persons = new Person[] {
    new Person() { FirstName = "John", LastName = "Appleseed", IsHuman = true },
    new Person() { FirstName = "Compu", LastName = "Tron", IsHuman = false }, 
    new Person() { FirstName = "John", LastName = "Tron", IsHuman = false } 
                           };

var wheres = new List<Func<Person, bool>>();

bool filterForJohn = true;
bool filterForHuman = false;

if (filterForJohn)
    wheres.Add(new Func<Person, bool>(p => p.FirstName == "John"));

if (filterForHuman)
    wheres.Add(new Func<Person, bool>(p => p.IsHuman));

IEnumerable<Person> results = persons;

foreach (var where in wheres)
    results = results.Where(where);

foreach (var p in results)
    Console.WriteLine(p.FirstName + ' ' + p.LastName);