如何合并表达式<func <t,tpropertytype =“”>&gt;进入我的IQueryable?</func <t,>

时间:2011-05-25 13:35:43

标签: c# linq lambda

我在服务基类中添加了一个方法来获取特定项目的所有未导出实例(类型为T的项目)

    public virtual IEnumerable<T> UnexportedToSun()
    {
        var query = GetIQueryable();
        query = query.Where(x => x.SunExportDate == null);
        return query.ToList();
    }

这很好用......但是我们有几个新案例需要传递一些查询。

我想要做的是使用

Expression<Func<T, TPropertyType>> 

语法,以便我可以做这样的事情......

var transportInvoices = _purchaseInvoiceService.UnexportedToSun(x => x.InvoiceType == InvoiceType.Transport);

上述工作正如我想象的那样......但我不知道现在该去哪里......

    public virtual IEnumerable<T> UnexportedToSun<TPropertyType>(Expression<Func<T, TPropertyType>> otherQuery)
    {
        var query = GetIQueryable();
        query = query.Where(x => x.SunExportDate == null);
        query = query //TODO: Add my other query
        return query.ToList();
    }

有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:3)

如果您只需要添加更多过滤器,则可以再次调用Where:

var query = GetIQueryable();
query = query.Where(x => x.SunExportDate == null);
query = query.Where(x => x.IsHappy);
return query.ToList();

这是LINQ的一个很好的功能 - 它是可组合的,所以你可以逐块建立。你也可以做其他的事情......例如:

var query = GetIQueryable();
query = query.Where(x => x.SunExportDate == null);
query = query.Select(x => x.ValueA + x.ValueB);
return query.ToList(); // Will return a List<int> or whatever instead

对于通用过滤器,您需要一个返回bool ::

的表达式
public virtual IEnumerable<T> UnexportedToSun(Expression<Func<T, bool>> predicate)
{
    var query = GetIQueryable();
    query = query.Where(x => x.SunExportDate == null);
    query = query.Where(predicate);
    return query.ToList();
}