動的に構築された文字列(where句)を使用してLINQで使用する前の質問の1つで、LINQ動的クエリライブラリDynamic LINQ。Dictionary <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)
メソッドを使用しています。どちらがうまくいくのですが、私は他の解決策を見つけることに興味があります。特にベンチマーク目的のため。
アイデア?まず
これに興味があります。しかし、var qry = myDictionary.Values.AsQueryable()。ここで(sQuery); はすべてのオブジェクトである辞書の値のみを検索するため、キー「CustomerID」に格納されている実際の名前にはまだ到達できません。 2番目の提案では、ダイナミックlinqライブラリで作業するために最も近いものは のような検索文字列を使用しています: "Keys [" CustomerID "] == 12345"、しかしそれでもライブラリ内で深く爆発しますこれは、返されたmemberinfoがKeysCollectionへの参照であり、特定の値ではないからです。 – Jabezz