2

エンティティ フレームワークでデータを選択する必要があるが、子と孫でフィルター処理する必要がある

私は4つのテーブルを持っています。Parent -> Child -> GrandChild -> GreatGrandChild私はすべての親を返したいのですが、子とひ孫をフィルタリングします。

つまり(例えば)

SELECT     Parent.* 
FROM       Parent 
INNER JOIN Child      
INNER JOIN Grandchild 
INNER JOIN GreatGrandChild 
WHERE      child.Column5           =  600   AND
           GreatGrandChild.Column3 = 1000 

データを更新してデータベースに saveChanges を保存する必要があるため、匿名型にすることはできません。

vs 2010 と EF 4.0 を使用

4

3 に答える 3

2

linq を使用すると、このようなものが必要になるはずです。

var q = from q1 in dbContext.Parent
        join q2 in dbContext.Children
        on q1.key equals q2.fkey
        join q3 in  ........
        where q4.col1 == 3000
        select q1;
于 2013-01-25T15:26:42.867 に答える
1

このクエリは、あなたが望むことをするはずです。はい、非常に深くネストされているため、少し混乱しています。

var result = context.Parent
                    .Where(parent => parent.Child
                                           .Any(child => (child.Column5 == 600) &&
                                                          child.GrandChild
                                                               .Any(grandchild => grandchild.GreatGrandChild
                                                                                            .Any(greatgrandchild => greatgrandchild.Column3 == 1000))));
于 2013-01-25T16:24:05.643 に答える
0

テーブルの構造-例が単なる説明ではない場合、ここでモデルについてもっと考えたいと思うかもしれません(つまり、子は個別のエンティティタイプですか、それとも定義された関係である必要がありますか?)

ただし、説明するのは単純な結合とwhere句であり、基本的に同じ方法で記述されています。つまり、DBContextからDBSetを返すと仮定します。

_context.Parents.Join(context.Child, p=>p.Parent.ID, c=>c.ParentID)
.Join(...Grandchild...).Where(o=>o.Column5=600)
.Join(...GreatGrandChild...).Where(o=>o.Column3=1000)

強く型付けされたエンティティを取り戻すために編集して、次のようなことをする必要があるかもしれません。

var greatgrandchildren = context.GreatGrandchildren.Where(o=>o.Column3=1000).ToList();
var grandchildren = context.Grandchildren.Where(o=>o.Column3=600 and greatgrandchildren.contains(o)).ToList();     
var children = context.Children.Where(o=>grandchildren.Contains(o)).ToList();
var parents = context.Parent(o=>children.Contains(o).ToList();

構文がオフになっている可能性があり、誰かが追加できます。最後の呼び出しまでのラウンドトリップを防ぐために.ToList()を回避できますか?

于 2013-01-25T15:35:15.133 に答える