2011-10-06 7 views
9

は私が1-N関係によって関連している2つのテーブルTeamTeamMemberを、持っているLINQLINQ複雑なクエリナビゲーションプロパティ

と私のデータベースからデータを取得し、ここで問題を抱えています。 私はEntity Frameworkを使用していますが、各列のプロパティを持つテーブルごとに1つのエンティティがあります。また、チームエンティティには、この関係の結果としてTeamMemberナビゲーションプロパティがあります。

チームメンバーとすべてのチームを取得できるクエリを実行したいと思います。

result = (from t in this.context.Teams 
      orderby t.Name 
      select t) 
     .Include("TeamMembers") 

これは問題なく動作します。 Team.TeamMemberプロパティに各チームのメンバーのデータが入力されたチームエンティティのコレクションを取得します。

問題は、TeamMembersのクエリをフィルタリングするような、より複雑なクエリを実行したいときです。

たとえば、両方のテーブルには列EndDateTimeがあります。終了していないすべてのチームメンバーとチームメンバーを取得したい場合(終了日時はnullではありません)、どうやって行うのかわかりません。

このクエリでは、チームのみをフィルタリングしますが、チームメンバはフィルタリングしません。

result = (from t in this.context.Teams 
      where t.EndDateTime == null 
      orderby t.Name 
      select t) 
     .Include("TeamMembers") 
     .ToList(); 

私は、クエリの後にメンバーのフィルタをコレクションに行うことを「解決」します。このように:

//Filter out the End dated care coordiantors 
var careCoordinatorsToDelete = new List<CareCoordinator>(); 
foreach (var team in result) 
{ 
    careCoordinatorsToDelete.Clear(); 

    foreach (var careCoordinator in team.CareCoordinators) 
    { 
     if (careCoordinator.EndDateTime != null) 
      careCoordinatorsToDelete.Add(careCoordinator); 
    } 

    foreach (var toDelete in careCoordinatorsToDelete) 
    { 
     team.CareCoordinators.Remove(toDelete); 
    } 
} 

しかし、これはまったく良い解決策ではないと思います。

+0

[条件付き包含のエンティティへのlinq?](http://stackoverflow.com/questions/1085462/conditional-include-in-linq-to-entities) –

+0

+1これは大きな質問です。 EFとはあまり関係のないことがありますが、それは重複しています。私は他にもいくつか重複があると思います。 –

+0

別の複製:http://stackoverflow.com/questions/1680863/linq-include-with-where-clause –

答えて

1

私が指摘したように、これは重複していると思います。しかし、答えを要約すると、(匿名型の一部として)Selectステートメントの一部として子にWhere句を含めるだけで、クエリを列挙してから、必要なオブジェクトを取得するだけです。

別のプロパティにしたいTeamMembersを選択したので、それらはデータベースから取得され、オブジェクトグラフに構築されます。

result = (from t in this.context.Teams 
      where t.EndDateTime == null 
      orderby t.Name 
      select new 
      { 
       Team = t, 
       Members = t.TeamMembers.Where(tm => tm.EndDateTime == null) 
      }) 
     .ToList() 
     .Select(anon => anon.Team) 
     .ToList(); 
+0

ねえ。私はそれを試みましたが、それは動作しません!レイジーローディングが無効化されている可能性がありますか? –

+0

@Asier - .ToList()はクエリの実行を強制します - したがって、この例は遅延読み込みではなく熱心な読み込みです... – barrypicker

0

これは動作するはずです:

var result = this.context.Teams.Where(t=>t.EndDateTime==null).Select(t=> 
new { Name = t.Name, 
      PropertyX = t.PropertyX... //pull any other needed team properties. 
      CareCoordinators = t.CareCoordinators.Where(c=>c.EndDateTime==null) 
}).ToList(); 

これは匿名オブジェクトのリストを返します。