目前我有这个自动占用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'。“
答案 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);