どのようにすることができます私はクールなホビーを持っている人だけを返します(IsCoolHobby == true)?
List<Person> tmp = container.PersonSet.Include("Hobbys")
.Where(p => p.Hobbys.Any(h => h.IsCoolHobby))
.ToList();
このことは、少なくとも1つのクールな趣味を持っていますが、それらの人々のためのHobbys
コレクションは常にすべて hobbys、また、かっこ悪いhobbysが含まれています人々をロードします。
編集
残念ながら、積極的なロード(Include
)中のフィルタリングやソートの子供たちは、現在サポートされていません。 request on the EF feature suggestion page for this featureがあります。リクエストには「Under review」というステータスがありますので、将来的に実装される可能性が少しあります。 (おそらく遠い未来:。少なくとも、MSDNのEF 5(ベータ版)についての最初のドキュメントは、フィルタリング/並べ替えと積極的なロードがまだ実装されていないことを明示的に言う)
今のところ唯一の2つの回避策があります。
var projectedData = container.PersonSet
.Where(p => p.Hobbys.Any(h => h.IsCoolHobby))
.Select(p => new
{
Person = p,
CoolHobbys = p.Hobbys.Where(h => h.IsCoolHobby)
})
.ToList();
結果はクールhobbysとこれらのクールなhobbysのコレクションを持っているユーザーが含まれている匿名オブジェクトのコレクションです:最初は、投影を使用することです。クエリでNoTracking
オプションを使用してチェンジトラッキングを無効にしない場合、人のhobbysコレクションに自動的に結果が入力されます。あなたがEntityObject
を使用している場合
CreateSourceQuery
をEntityCollection
秒、すなわち上でのみ提供されています:ここで注意することは List<Person> tmp = container.PersonSet
.Where(p => p.Hobbys.Any(h => h.IsCoolHobby))
.ToList();
foreach (var person in tmp)
{
person.Hobbys.Attach(person.Hobbys.CreateSourceQuery()
.Where(h => h.IsCoolHobby).ToList());
}
2つのこと:
2番目のオプションは、CreateSourceQuery
と「明示的な」ロードを使用することです派生した実体。 EF 4.0のPOCOエンティティでは使用できません。 Query()
メソッド
- 上記のコードは、データベースへの1 + N回のラウンドトリップを表します。最初はホビーを持たない人物収集のためのもので、もう1つは追加ですクールなホビーを読み込むための人のクエリ。
ありがとうございました。すべてのPersonをロードし、クールなホビーだけをロードすることは可能ですか?(申し訳ありませんが、適切であると指定されています) Personは少なくとも1つの趣味を持っているとします。 – damike
@damike:上記のEditを参照してください。 – Slauma
おかげさまで、ありがとうございました:-) – damike