有条件地添加.Take()

时间:2013-04-24 21:09:58

标签: linq c#-4.0

目前我有这个自动占用500行:

var orderQuery = subsetTable.Where(pred).OrderByDescending(o => o.CreationDate).Take(500);

我想使Take()有条件,如下所示:

var orderQuery = subsetTable.Where(pred).OrderByDescending(o => o.CreationDate);
if (condition)
    orderQuery = orderQuery.Take(500);

这可能吗?

编辑:
编译器说

  

“无法将类型'System.Linq.IQueryable'隐式转换为   'System.Linq.IOrderedQueryable'。“

4 个答案:

答案 0 :(得分:14)

添加“AsQueryable”以使类型对齐:

var orderQuery = subsetTable.Where(pred).OrderByDescending(o => o.CreationDate).AsQueryable();
if (condition)
    orderQuery = orderQuery.Take(500);

答案 1 :(得分:11)

在Linq-to-Objects中,var将推断为IOrderedEnumerable<T>,其中T是您对象的类型。 Take()将生成IEnumerable<T>,因此您的代码行将不被允许。 (IOrderedEnumerable比IEnumerable指定的更多,您需要以较少指定的方式键入您的查询。)并且,正如评论所指出的那样,对于以IQueryable<T>方式处理的提供者也是如此,这本身就可以表示为较少指定的IEnumerable<T>

要使其有效,请将您的查询显式键入所需的较小指定类型IEnumerable<T>IQueryable<T>,然后您可以应用条件Take

IEnumerable<YourType> orderedQuery = ...
if (condition)
     orderedQuery = orderedQuery.Take(n);

答案 2 :(得分:8)

  

这可能吗?

是。您的代码几乎应该像编写的那样工作你只需要消除var。假设您的类型为Order。你会用:

IQueryable<Order> orderQuery = subsetTable.Where(pred).OrderByDescending(o => o.CreationDate);
if (condition)
    orderQuery = orderQuery.Take(500);

答案 3 :(得分:-2)

我所做的是在最后添加排序,以避免转换它们

var orderQuery = subsetTable.Where(pred);

if (condition)
    orderQuery = orderQuery.Take(500);

orderQuery = orderQuery.OrderByDescending(o => o.CreationDate);