私はエンティティ フレームワークを使用して linq クエリを作成しているため、クエリはデータベースで実行され、返されるデータを最小限に抑えます。クエリには、オプションの検索条件と毎回実行される順序付けを含めることができます。親子(ママ・パパタイプ)と一緒に活動しています。私が実装しようとしているフィルターは、子供の年齢です。
だから私はそのようないくつかのデータを持っている場合...
parent 1
- child[0].Age = 5
- child[1].Age = 10
parent 2
- child[0].Age = 7
- child[1].Age = 23
...そして、最低年齢を 8 歳に指定すると、表示する意図した結果は...
parent 1
- child[1].Age = 10
parent 2
- child[1].Age = 23
...そして、最低年齢を 15 歳と指定した場合、表示するつもりです...
parent 2
- child[1].Age = 23
この恐ろしいクエリを使用して、予想される結果を再作成できます (実際には複数のクエリを実行していると思います)。
var parents = context.Parents;
if(minimumChildAge.HasValue)
{
parents = parents.Where(parent => parent.Children.Any(child => child.Age >= minimumChildAge.Value));
foreach(var parent in parents)
{
parent.Children = parent.Children.Where(child => child.minimumChildAge.Value >= mimumumChildAge);
}
}
parents = parents.OrderBy(x => x.ParentId).Take(50);
そこで、代わりに別の方法を試しました...
var query = from parent in context.Parents
select parent;
if (minimumChildAge.HasValue)
query = from parent in query
join child in context.Children
on parent.ParentId equals child.ParentId
where child.Age >= minimumChildAge.Value
select parent;
query = query.OrderBy(x => x.ParentId).Take(50);
これを linqpad で実行すると、生成されたクエリが適切に表示されます。だから私の質問...
これはこれを行う正しい方法ですか?より良い方法はありますか?ここで最大年齢を指定した場合、同じ結合を作成し、エンティティ フレームワークがそれをうまく処理してくれることを期待するというのは、少しおかしな話です。さらに、これは遅延読み込みにどのように影響しますか? 基準に一致する子のみが返されることを期待しています。では、parent.Children
エンティティ フレームワークは、これらを照会したことと、フィルター処理されたコレクションで作業していることを認識していますか?