2009-08-20 3 views
6

動的に構築された文字列(where句)を使用してLINQで使用する前の質問の1つで、LINQ動的クエリライブラリDynamic LINQDictionary <string、object>および.AsQueryable()でLINQ動的クエリライブラリを使用する

最初の問題はIQueryableにのみ適用されていましたが、これはIEnumerableで.AsQueryable()拡張メソッドを使用することで克服できます。

私が遭遇した問題は、ダイナミックLINQは、 "CustomerID"(またはダイナミックlinqの文字列述語に渡されたもの)というプロパティを探していたことです。ディクショナリにはキーと値しかないので明らかに機能しません。

私は巧みだと思って、: Dictionary<string, object>、ICustomTypeDescriptor`を拡張したクラスを作成しました。

これにより、タイプ上でGetProperties()を無効にすることができました。それは素晴らしいです。辞書キーを繰り返して、返されるPropertyDescriptorCollectionに追加することができます。

しかし、私は別の問題に遭遇しました。ダイナミックLINQライブラリ全体では、タイプだけを含む 'Expression instance'で動作します。しかし私のCustomTypeDescriptorソリューションを動作させるには、TypeDescriptor.GetProperties(instance, false)を適用する前に、タイプの実際のインスタンスが必要です。

だから、実際の質問になる。上記のすべての情報を考慮して、データがキーと値のペアを持つディクショナリに格納されている場合、LINQクエリに文字列形式 "CustomerID = 1234 AND Quantity> = 10000"でカスタムwhere句を適用するにはどうすればよいですか。

私の現在の解決策は、DataTableにデータを変換し、.Select(query)メソッドを使用しています。どちらがうまくいくのですが、私は他の解決策を見つけることに興味があります。特にベンチマーク目的のため。

アイデア?まず

答えて

2

- あなたは、あなたが辞書としてそれを使用していない、このように辞書にアクセスする場合 - あなたは試してみました:

var qry = myDictionary.Values.AsQueryable().Where(sQuery); 

を(あなた'LL、あなたがobjectを使用している場合ことに注意してくださいを呼び出した後IQueryable<T>ためIEnumerable<T>

T(ひいてはも:おそらくどこかでCast<Customer>またはOfType<Customer>

そうでない場合が欲しいです拡張方法)はです。KeyValuePair<TKey,TValue>ですので、Where("Value.CustomerID == 12345")などを使用することができます。

+1

これに興味があります。しかし、var qry = myDictionary.Values.AsQueryable()。ここで(sQuery); はすべてのオブジェクトである辞書の値のみを検索するため、キー「CustomerID」に格納されている実際の名前にはまだ到達できません。 2番目の提案では、ダイナミックlinqライブラリで作業するために最も近いものは のような検索文字列を使用しています: "Keys [" CustomerID "] == 12345"、しかしそれでもライブラリ内で深く爆発しますこれは、返されたmemberinfoがKeysCollectionへの参照であり、特定の値ではないからです。 – Jabezz

関連する問題