2016-04-15 5 views
2

簡単な作業ではないかと思います。私が見つけたすべての投稿は、子供たちだけを返すように見えるか、またはnullを手伝ってはいけません。私はEFを使用している以下のクラス親とフィルタリングされた子リストが存在する場合はそれを選択する方法(外部結合)

public class Parent 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public virtual List<Child> Children { get; set; } 
} 

public class Child 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public int isCurrent { get; set; } 
} 

を持っていると私は特定の親、それが存在する場合現在子を返したいです。だから私にとってこれは左外部結合のようなものです。メソッドの拡張機能を使いたいのですが、これはどのように機能するかを理解したいと思っています。

私が試した擬似コードは次のとおりです。私は現在の子供がいなくても親を返すことができないようです。

var test = db.Parents 
       .Where(p => p.ID == 1) 
       .Select(p => p.Children.Where(c => c.isCurrent == 1).DefaultIfEmpty()        
       ); 

親オブジェクトを返すようにしたいのですが、現在の子がある場合にのみコレクションに子オブジェクトを設定します。

+0

私の周り探していますと、これは似ているようです。しかし、メソッド拡張を使用しません。一方的に利益があるかどうかは分かりません。 http://stackoverflow.com/questions/9705463/linq-to-entity-framework-return-a-list-of-parents-with-only-a-subset-or-empty-co – Andrew

+0

"*現在の* *子**もし存在すれば* "あなたはただ**子**だけが現在のものであると言っていますか? –

+0

これはフィルタリングされたインクルードの質問の毎週の化身だと思います。おそらく、[this](http://stackoverflow.com/q/16798796/861716)(または他の多くのもの)の複製です。 –

答えて

1

また、あなたがExplicit Loadingを使用している場合あなたが望むものを達成することができます

var parent=db.Parents.FirstOrDefault(p=>p.ID==1); 
context.Entry(parent) 
     .Collection(p => p.Children) 
     .Query() 
     .Where(c => c.isCurrent==1) 
     .Load(); 
+0

これは面白いです、私はそれを試してみましょう。これは私にはこれが簡単ではないことはちょっと奇妙です。 – Andrew

+0

これは私のために働いてしまった。繰り返しますが、これは一般的なクエリのように思えますが、まだそれほど簡単ではないことに驚いています。 – Andrew

+0

はい、インクルードのフィルタはまだ制限です; – octavioccl

2

EF のナビゲーションプロパティを使用すると、結合について考える必要はありません.EFがあなたのために行います。特別条件を指定しないと、one-to-many(例:parent - > children)が左外部結合と結合されます。

だから、あなたが必要とするのは、希望の結果に集中することだけです。あなたが実際にこのような何か、その後、1つだけ、現在の子(存在する場合)が必要な場合

var test = (from p in db.Parents 
      where p.ID == 1 
      select new 
      { 
       Parent = p, 
       CurrentChildren = p.Children.Where(c => c.isCurrect == 1) 
      }).FirstOrDefault(); 

:あなたは、特定の親を返すようにしたいし、それが子供現在だ場合たとえば、あなたはこのようなものを使用することができます:

var test = (from p in db.Parents 
      where p.ID == 1 
      select new 
      { 
       Parent = p, 
       CurrentChild = p.Children.FirstOrDefault(c => c.isCurrect == 1) 
      }).FirstOrDefault(); 
+0

これは、ParentオブジェクトとCurrentChildオブジェクトで構成されるオブジェクトを返します。 Parentオブジェクトには、それでもすべての子を含む子のプロパティがありますか?私は1つのオブジェクト(親オブジェクト)を私のビューに戻したいと思っています...そして、私はそれが現在の子のみが含まれているか、現在の子がない場合は何も含まれないようにします。 (各親は現在の子を1人しか持たないと仮定します) – Andrew

+0

次に、別の解決策を試すことができます。エンティティモデルをこのように再利用することは良くありません。エンティティはコンテンツをフィルタリングすべきではありません。なぜなら、データベースにあるデータを表すためです。 –

関連する問題