3

次のような LINQ クエリの式ツリーを構築する必要があります。

collection.OrderBy(e => ((MyObject)e["PropertyIndex"]).dictionary.Where(k => k.Key == "keyName").Select(k => k.Value).Single());

OrderBy メソッドをチェーンする方法を説明するこのリンクを見ました。Expression Tree を使用して OrderBy 内に Where を追加する方法がわかりません。

アップデート:

メモリ内のデータを動的にソートする必要があります。したがって、linq クエリは次のようになります。

collection.OrederBy(field1).ThenByDescending(field2).ThenBy(field3)

いくつのフィールドで並べ替える必要があるかは、実行時にしかわかりません。fieldX のいずれかを複合オブジェクトにすることができます。もちろん、オブジェクトのタイプは実行時に認識されます。オブジェクトの 1 つは、上記の LINQ クエリに見られるような構造を持っています。辞書があり、特定のキーをソートする必要があります。私の場合、辞書には次のようなローカライズされたデータが含まれています。

{{"en-US", "word (en)"}, {"es-ES", "word (es)"} , ....}

特定の言語で並べ替える必要があります。

4

2 に答える 2

1

クエリがこれを行っているようです:

from k in collection
where k.Key == "keyName"
orderby ((MyObject)k)["PropertyIndex"]
select k.Value

次のように where 句をさらに追加できます。

from k in collection
where k.Key == "keyName"
&& k.OtherProperty == OtherValue
orderby ((MyObject)k)["PropertyIndex"]
select k.Value

編集: 要件が明確になったので、最初にすべての where 句を実行し (無視するデータを並べ替える必要はありません)、次にすべての .OrderBy() を適用することをお勧めします。それらをラムダにすることができれば、それはあなたが提案したリンクよりもはるかに簡単です(しゃれが意図されています):

.OrderBy( e => e.Property1 ).OrderBy( e => e.Property2 )

これらを「動的に」形成したい場合は、次のようにします。

var query = (from k in collection select k);
query = query.Where( e => e.Property1 == "value" );
var orderedQuery = query.OrderBy( e => e.Property1 );
orderedQuery = query.Orderby( e => e.Property2 );
var result = orderedQuery.Select( e => e.Value ).Single();

これらにいくつかの条件を振りかけると、あなたは金色になります。IQueriable<T>query は typeで、orderedQuery は typeであることに注意してください。そのIOrderedQueriable<T>ため、(キャストせずに) 同じ var を再利用することはできません。

于 2012-05-16T19:00:20.010 に答える
0

OrderByによって最初の注文フィールドを適用し、ThenByによって他のすべてのフィールドを適用する必要があります。当然のことながら、IOrderedEnumerable型の一時変数を使用する必要があります。

いくつかのフィルターを追加する必要がある場合は、注文の前にWhereを追加する必要があります。

可能な順序オプションが多数あり、それらをハードコーディングしたくない場合は、Dynamic LinQを使用して、順序フィールドを文字列として指定できます。

于 2012-05-16T19:44:21.270 に答える