2012-09-18 12 views
7

クエリの形を変更すると、Entity Frameworkがインクルード呼び出しを無視することがわかりましたが、選択したときにサブプロパティを読み込む方法があります。グループ。次の例では、特定の期間に就業しているすべての従業員に通知したいと考えています。その場所の後に.ToArray()を呼び出すと、データベースに一度しかヒットしませんが、メモリ内でSelectManyとGroupByを実行しています。 SelectManyとGroupByをSQLサーバー上で実行し、ServiceTypeとShipとEmployeeの詳細を含める方法がありますか?Entity Frameworkをグループに積極的に読み込むBy

データベースに対して1回のSQL呼び出しを行い、期間内のジョブとそれが割り当てられているジョブの一覧を持つ従業員のリストを作成する方法を探しています。

var employeeJobs = DataContext.Jobs. 
    Include("ServiceType"). 
    Include("Ship"). 
    Include("JobEmployees.Employee"). 
    Where(j => j.Start >= now && j.Start <= finish). 
    OrderBy(j => j.Start). 
    ToArray(). 
    SelectMany(j => j.JobEmployees, (j, je) => new { 
     Job = j, 
     Employee = je.Employee 
    }).GroupBy(j => j.Employee); 
+0

_Iはからmemory_にSelectManyとGROUPBYをしています。どうして知っていますか? EFでのクエリの形状は分かりにくい場合があります。 –

+0

従業員とその職務のリストにしたい場合は、別の方法でクエリを実行することをお勧めします:employeeJobs = DataContext.Employees e e.Any(...職務基準...) eを選択します。私は、インテリセンスの助けを借りずにLINQクエリを書くことができませんが、アイデアは得られますか? – GTG

+1

@GertArnold 'ToArray'の呼び出しは結果を具体化し、' SelectMany'と 'GroupBy'は' ToArray'の呼び出しの後に来ます。 – casperOne

答えて

0

なぜビューを作成し、それをEFから参照しないでください。 、これには、アプリケーションサーバーではなく、データベースサーバーが作業を行うという利点もあります。

+0

EFの全体のポイントは、ということです仕事**は**データベースサーバー上で行われています。したがってあなたの答えは意味をなさない。 –

-1

あなたのグループの後で、Include()の最後まで移動しようとしています。

次は動作するはず
+0

IncludeはObjectQueryで定義され、GroupByの戻り型であるIQueryableでは定義されません。これがうまくいくとは思わない:( –

1

var q = from e in DataContext.Employees 
    where e.Job.Start > .... 
    order by e.Job.Start 
    select new {Employee = e, Job = e.Job, Ship = e.Job.Ship, ServiceType = e.Job.ServiceType}; // No db hit yet. 

var l = q.GroupBy(item=>item.Employee) // no db hit yet. 
    .ToList(); // This one causes a db hit. 
関連する問題