目前我有这个自动占用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)
这可能吗?
是.您的代码几乎应该像编写的那样工作 你只需要消除var
.假设你的类型是Order
.你用的是:
IQueryable<Order> orderQuery = subsetTable.Where(pred).OrderByDescending(o => o.CreationDate);
if (condition)
orderQuery = orderQuery.Take(500);
Run Code Online (Sandbox Code Playgroud)