2016-07-01 12 views
1

LINQ to Objectsでは、述語を使用してコレクションのサブセットを簡単にフィルタリングできます。ドメインクラスがPersonでコレクションがpersons、述語がFunc<Person, bool> filterの場合、persons.Where(filter).ToArray()のようになります。ドメインクラスの述語を使用して検索

人のコレクションと同様の機能をXElementとしてシリアライズ:

xPersonsは人の要素( 『人』という名前のそれぞれ)を含むルート要素である
XElement[] xFiltered = xPersons.Elements("Person") 
           .Where(xFilter) 
           .ToArray(); 

Func<XElement, bool> xFilterとしてXElement上で定義された述語引数の型。

WhereステートメントをXMLのLINQに作成すると、Func<XElement, bool>の代わりにFunc<Person, bool>という型の述語を引数にとりますか?これを行うには、Func<Person, bool>Func<XElement, bool>に変換するコンバータを実装する必要がありますが、これは直感的でエラーが発生しやすい方法です。そのような種類の純正コンバータを(例えば、検査に基づいて)構想することができるか?それとも単に存在するのだろうか?

+0

私たちはどのように知っていませんXElementから 'Person'を作成してください。いったん取得すれば残りは簡単です。 –

答えて

2

基本となるXElementとXAttributeに述部を作成できます。

xPersons.Elements("Person") 
     .Where(e => (string)e.Attribute("Name") == "Alex") 

あなたが最初にそれをデシリアライズする必要がPersonクラスを使用するには:

xPersons.Elements("Person") 
     .Select(e => CreatePerson(e)) 
     .Where(p => p.Name == "Alex") 

private static Person CreatePerson(XElement element) 
{ 
    // your (de)serialization logic goes here 
} 

か、あなたのクラスで明示的なキャスト演算子を書くことができた:

xPersons.Elements("Person") 
     .Where(e => ((Person)e).Name) == "Alex") 

public static explicit operator Person(XElement element) 
{ 
    // your (de)serialization logic goes into your Person class 
} 
+0

はい、クラスPersonには、ソリューションに相当するFromXElement(XElement x)関数があります。しかし、コレクション全体を逆シリアル化してからFunc でフィルタリングすると、これは(imho)同じになります。 –

+0

@AlexKonnen:はい、各要素またはコレクション全体をシリアル化できます。これはXMLコンテンツではなくクラスPersonを使用する唯一の方法です。 – abatishchev

関連する問題