有条件地添加.Take()

chr*_*mat 9 linq c#-4.0

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

var orderQuery = subsetTable.Where(pred).OrderByDescending(o => o.CreationDate).Take(500);
Run Code Online (Sandbox Code Playgroud)

我想制作Take()条件,如下所示:

var orderQuery = subsetTable.Where(pred).OrderByDescending(o => o.CreationDate);
if (condition)
    orderQuery = orderQuery.Take(500);
Run Code Online (Sandbox Code Playgroud)

这可能吗?

编辑:
编译器说

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

Tor*_*mod 16

添加"AsQueryable"以使类型排成一行:

var orderQuery = subsetTable.Where(pred).OrderByDescending(o => o.CreationDate).AsQueryable();
if (condition)
    orderQuery = orderQuery.Take(500);
Run Code Online (Sandbox Code Playgroud)


Ant*_*ram 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);
Run Code Online (Sandbox Code Playgroud)


Ree*_*sey 8

这可能吗?

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

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