C#のLINQ述語型引数
-
22-08-2019 - |
質問
私はモックデータの値とのXElementを持っています。
私は、XMLを照会する式があります:
Expression<Func<XElement, bool>> simpleXmlFunction =
b => int.Parse(b.Element("FooId").Value) == 12;
で使用します:
var simpleXml = xml.Elements("Foo").Where(simpleXmlFunction).First();
デザイン時エラーがあります:
メソッド「System.Linq.Enumerable.Where(System.Collections.Generic.IEnumerable、System.Func)」の型引数は、使用から推測することができません。 「明示的に型引数を指定してみてください。
デリゲートは、のXElementに取り、ブール値を返す、アイテムがクエリに一致した場合、私は、デリゲートまたはタイプをマークする句に多くのものを追加する方法を確認していないマーキングすべきところに供給されます。
また、エンティティフレームワークに対する実際の関数の平行法では、この問題は発生しません。 LINQからXMLへのバージョンで正しいものではありません?
解決
simpleXmlFunction式<のFunc
Func<XElement, bool> simpleXmlFunction =
new Func<XElement, bool>(b => int.Parse(b.Element("FooId").Value) == 12);
他のヒント
私は完全な答えは前の回答、デビッド・モートンさんのコメント、および更新されたコードスニペットを含んだと思います:
のIQueryableため.Where実装は、IEnumerableをするため.Where実装とは異なります。 IEnumerable.Whereは期待しています:
Func<XElement, bool> predicate
あなたが実行して持っている表現から関数をコンパイルすることができます:
Expression<Func<XElement, bool>> simpleXmlExpression =
b => int.Parse(b.Element("FooId").Value) == 12;
Func<XElement, bool> simpleXmlFunction = simpleXmlExpression.Compile();
var simpleXml = xml.Elements("Foo").Where(simpleXmlFunction).First();
これは、生成された式ツリーを見てとXMLコレクションを照会するためにコンパイルされた形式を使用できるようになります。
所属していません StackOverflow