1

これは私の実際の例です。私は4つのテーブルを持っています:

  • プラン
  • カバレッジ
  • 対象メンバー

一人一人が多くのプランを持つことができ、それらのプランのそれぞれが多くの補償範囲を持つことができます。これらの各カバレッジには、多数の CoveredMembers を含めることができます。

Plan.PlanType == 1とにフィルターを適用するクエリが必要CoveredMembers.TermDate == nullです。このクエリは、終了していない医療タイプのプランを持っている人を呼び戻す必要があります。

この SQL ステートメントはまさにそれを行います。

SELECT Person.*, Plans.*, Coverages.*, CoveredMembers.* 
FROM Person P 
INNER JOIN Plan PL ON P.PersonID = PL.PersonID 
INNER JOIN Coverage C on PL.PlanID = C.PlanID 
INNER JOIN CoveredMember CM on C.CoverageID = CM.CoverageID 
WHERE CM.TermDate = NULL AND PL.PlanType = 1

匿名型を使用してこれを行う方法を理解しましたが、データを更新してデータベースに保存し直す必要がある場合があります。匿名型は読み取り専用です。

JOIN を使用して機能するソリューションが提供されましたが、それは人を戻すだけでした (ただし、必要な方法でフィルター処理されました)。次に、各人をループできます。

foreach (var person in persons) {
  foreach (var plan in person.Plans{
    //do stuff 
  }
}

しかし、それはループの繰り返しごとに db 呼び出しを行いませんか? 私はそれぞれ 3 つの未終了の医療計画を持つ 500 人を抱えているので、データベースを 1500 回呼び出すことになりますか?

これが、Persons から CoveredMembers までのデータ ツリー全体を一度に戻したい理由です。これは不可能ですか?

4

1 に答える 1

0

これは次の 2 つの部分で達成されると思います。

  1. この質問で以前に説明したように、条件に基づいて返してもらいたい人を決定するためのクエリ:エンティティ フレームワーク。結果のフィルタリングに助けが必要

  2. 熱心に読み込まれるようにまとめたいエンティティのナビゲーション プロパティを適切に設定する: http://msdn.microsoft.com/en-us/data/jj574232.aspx

たとえば、 Person エンティティが次のようになっているとします。

public class Person {
   public List<Plan> Plans {get; set;}
   ...
}

dbcontext からデータを返す場合、includeオプションで明示的な熱心な読み込みを使用することもできます。

 var people = context.People
         .Include(p => p.Plans)
         .ToList();
....

これらがネストされている場合 - カバレッジは計画などの一部です (これは次のようになります):

 var people = context.People
         .Include(p => p.Plans.Select(pl=>pl.Coverage).Select(c=>c.CoveredMembers)))
         .ToList();
....

ここでは、データ モデルについていくつかの仮定を立てています。上記のコードは、おそらく少し調整する必要があります。

編集

ここで他の誰かが検討する必要があるかもしれませんが、そのようなインクルードに where 句を追加することはできないと思います (上記の例では、コンテキスト オブジェクトにインクルードを配置することで少しそのようになり、代わりに IQueryable を返します)最初の投稿で条件を解決済みとして設定し (ToList() を呼び出さずに)、上記のコードを Where 句なしで使用します。

最初の投稿から(この投稿では異なる基準を指定しましたが、コンセプトは同じです)

 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;

それで:

List<Person> people = q.Include(p => p.Plans
  .Select(pl => pl.Coverages)
  .Select(c => c.CoveredMembers).ToList();

繰り返しますが、トラブルシューティングを行うことができずにこれを行うと、これも解決するのに数回の試行が必要になると確信しています.

于 2013-01-25T21:19:14.860 に答える