我有一个我在下面查询的集合。
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声明提供的参数数量不正确
答案 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);