述語型引数のC#LINQ

c# entity-framework expression-trees lambda

質問

私はモックデータの値を持つ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)'の型引数は、その使用から推論できません。型引数を明示的に '

Whereに渡された代理人がXElementを取り込み、boolを返す必要があります。アイテムがクエリと一致する場合、デリゲートまたはwhere句を追加する方法がわかりません。

また、Entity Frameworkに対する実際の関数の並列方法にはこの問題はありません。 LINQとXMLのバージョンが正しくない点は何ですか?

受け入れられた回答

simpleXmlFunctionを式<Func <XElement、bool >>にしないでください。それをFunc <XElement、bool>にします。これは、.Whereの代議員として期待されるものです。

Func<XElement, bool> simpleXmlFunction =
     new Func<XElement, bool>(b => int.Parse(b.Element("FooId").Value) == 12);

人気のある回答

私は完全な答えは、前の答え、デイビッドモートンのコメント、および更新されたコードスニペットが含まれていると思う:

IQueryableの実装は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コレクションを照会することができます。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ