C# 如何将简单表达式附加到IQueryable上

C# 如何将简单表达式附加到IQueryable上,c#,entity-framework,linq,expression,C#,Entity Framework,Linq,Expression,我有以下方法: 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);

我有以下方法:

    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()
    }
public List SearchTest(字符串city、int skip、int take)
{
EcomContext db=新的EcomContext();
var results=db.Customers.Where(n=>n.City==City).OrdeyBy(n=>n.Name).Skip(Skip).Take(10);
结果=AddDeleteCheck(结果);
返回结果。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);
    } 
private IQueryable AddArchivedCheck(IQueryable数据)
{
var参数=表达式参数(typeof(T));
var e1=Expression.Equal(Expression.Property(参数,“归档”),Expression.Constant(false));
var e2=data.Expression;
var e3=表达式.Lambda(表达式.AndAlso(e1,e2),参数);
返回数据。其中(e3);
} 
我希望能够从许多不同的函数中调用此方法,因此我将其设置为泛型。它应该从IQueryable对象获取表达式,并在其上添加一个检查(Archived==false)

我得到这个错误:
没有为类型“System.Boolean”和“System.Linq.IQueryable”[Ecom.Customer]

定义二进制运算符AndAlso。这比您编写的更简单:

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);
} 
相当于:

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

这比你写的要简单:

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);
} 
相当于:

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