如何在IQueryable上附加一个简单的表达式

时间:2016-02-22 11:09:23

标签: 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);

        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对象中获取表达式并在其上添加一个检查(Archived == false)。

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

1 个答案:

答案 0 :(得分: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);