13

目前我有这个自动占用 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

4 回答 4

20

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

var orderQuery = subsetTable.Where(pred).OrderByDescending(o => o.CreationDate).AsQueryable();
if (condition)
    orderQuery = orderQuery.Take(500);
于 2013-04-24T21:26:29.207 回答
12

在 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);
于 2013-04-24T21:17:45.513 回答
8

这可能吗?

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

IQueryable<Order> orderQuery = subsetTable.Where(pred).OrderByDescending(o => o.CreationDate);
if (condition)
    orderQuery = orderQuery.Take(500);
于 2013-04-24T21:11:13.480 回答
-2

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

var orderQuery = subsetTable.Where(pred);

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

orderQuery = orderQuery.OrderByDescending(o => o.CreationDate);
于 2013-04-24T21:31:53.650 回答