2016-02-22 19 views
1

我有以下方法:如何将简单的表达式追加到IQueryable的

public List<Customer> SearchTest(string city, int skip, int take) 
    { 
     EcomContext db = new EcomContext(); 

     var results = db.Customers.Where(n => n.City == city).OrdeyBy(n => n.Name).Skip(skip).Take(10); 

     results = AddDeleteCheck<Customer>(results); 

     return results.ToList() 
    } 

而这种可重复使用的方法:

private IQueryable<T> AddArchivedCheck<T>(IQueryable<T> data) 
    { 
     var parameter = Expression.Parameter(typeof(T)); 
     var e1 = Expression.Equal(Expression.Property(parameter, "Archived"), Expression.Constant(false)); 
     var e2 = data.Expression; 
     var e3 = Expression.Lambda<Func<T, bool>>(Expression.AndAlso(e1, e2), parameter); 

     return data.Where(e3); 
    } 

我希望能够从众多的调用此方法不同的功能,所以我已经使它通用。它应该从IQueryable对象中获取表达式,并在此处添加一个检查(存档== false)。

我收到此错误: 二元运算符AndAlso没有为类型“System.Boolean”和“定义System.Linq.IQueryable` [Ecom.Customer]

回答

4

它比你写的文章更容易:

private static IQueryable<T> AddArchivedCheck<T>(IQueryable<T> data) 
{ 
    var parameter = Expression.Parameter(typeof(T)); 
    var e1 = Expression.Equal(Expression.Property(parameter, "Archived"), Expression.Constant(false)); 
    var lambda = Expression.Lambda<Func<T, bool>>(e1, parameter); 
    return data.Where(lambda); 
} 

请记住,在LINQ的:

var result = query.Where(condition1).Where(condition2); 

等同于:

var result = query.Where(condition1 && condition2);