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

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 に答える