2017-08-21 16 views
0

を戻しながら、子コレクションにレコードを削除し、私は次のモデルがあります:C#のLINQフィルターと親

Parent     Child 
-------------   ----- 
int id;     int id; 
string name;    string name; 
List<Child> children; bool isDeleted; 

私はEFを使用していますが、私は子供が削除されていないところ親IDによって親の子コレクションを取得したいです。

私は次のことを試してみました:

var parentRepo = repoFactory.Get<ParentRepo>(); 
var parent = parentRepo.where(x => x.id == parentId && x.children.All(y => !y.isDeleted)); 

が、それは動作しませんでした。私はまた、以下を試してみましたが、働いていた:

var parentRepo = repoFactory.Get<ParentRepo>(); 
var parent = parentRepo.where(x => x.id == parentId); 
      .Select(x => new { id = x.id, name = x.name, children = x.children.Where(y=> !y.isDeleted).ToList() }).ToList() 
      .Select(y => new Parent { id = y.id, name = y.name, children = y.children }).ToList(); 

をしかし、私は働いているクラスはかなり大きいですし、私はそのような各プロパティを設定するために良い方法ですかどうかわからないですし、私はいくつか存在しない可能性があります将来私は新しい財産を追加する場合。

外側(親)を保持している間に内部コレクションをフィルタリングするフィルタが他にありますか? Thnaks!

+0

https://stackoverflow.com/questions/7079378/how-to-filter-nested-collection-entity-framework-objects – Etienne

+0

「うまくいかない」とはどういう意味ですか?何が起こり、どのようにあなたが望むものと違うのですか? – stybl

答えて

0

親の子コレクションを取得する親のIDは、子の は削除されません。

これは少し不明であるが、私は、これはあなたが削除されていない少なくとも1 Child、一緒にすべての非削除された子どもたちの意志を持っているそれらのParentsのコレクションをしたいということを前提としています。

また、Parentsには削除されていないものがChildrenであることが必要な場合もあります。その場合、クエリは似ています。

エンティティフレームワークone-to-many relationshipがルールに従ってモデル化されている場合、これは簡単です。

class Parent 
{ 
    public int Id {get; set;} 

    // a Parent has zero or more Children: 
    public virtual ICollection<Child> Children {get; set;} 
    ... 
} 

public class Child 
{ 
    public int Id {get; set;} 

    // a Child belongs to exactly one Parent, via foreign key ParentId: 
    public int ParentId {get; set;} 
    public virtual Parent Parent {get; set;} 
} 

通常、これはあなたがParentChildren間の1対多のリレーションシップをモデル化するエンティティフレームワークに通知するのに十分なされていると思います。 Childの非標準複数化のため、Childrenには流暢なAPIまたは属性が必要な場合がありますが、それはこの質問の範囲外です。

ところで、私はあなたのリストをICollectionに変更しましたか?私はそれをテストしていませんが、エンティティフレームワークがリストで正しく動作しないことは確かです。あなたが正しくあなたの一対多モデル化したら

Child thirdChild = Parent.children[3]; 

、クエリがシンプルになります:私は、あなたが次のことを照会した場合に何が起こるか疑問に思う言葉で

// all parents that have at least one child that is not deleted: 
var allParentsWithNonDeletedChildren = myDbContext.Parents 
    .Select(parent => new 
    { // take only the Parent properties you will use: 
     Id = parent.Id, 
     Name = parent.Name, 

     // take only the non-deleted children: 
     Children = parent.Children.Where(child => !child.IsDelected), 
    }) 
    // keep only those parents that have any non-deleted Children: 
    .Where(parent => parent.Children.Any()); 

から親コレクション内のすべての親は、親のIDと名前を持つanonymous typeのオブジェクトと削除されていない子のコレクションを作成します。結果のコレクションから、少なくとも1つの子を持つ子コレクションを持つオブジェクトのみを取得します。