0

データベース構造を制御できないプロジェクトに参加しています。データベースからモデルを作成しましたが、以下のすべてのテーブルに外部キーがあります。ユーザー テーブルとは別に、各テーブルには約 500k から 1000k の行があり、かなり幅があります。

EF5 でこのクエリを実行すると、2 秒以上かかります。

 var customerEngage = ctx.Customer_TB
                        .Include(c => c.Insurance_TB)
                        .Include(c => c.Insurance_TB.Select(i => i.H80Row_TB))
                        .Include(c => c.Insurance_TB.Select(i => i.WinsureRow_TB))
                        .Include(c => c.Insurance_TB.Select(i => i.User_TB))
                        .Include(c => c.Insurance_TB.Select(i => i.User_TB.Department_TB))
                        .SingleOrDefault(c => c.IDCustomer == myID);

関連テーブルに必ずしも行が存在するわけではありません。

パフォーマンスの問題なしに、次の SQL クエリを実行できます。

SELECT * 
from dim.Customer_TB c
    INNER JOIN fact.insurance_tb i on i.IDCustomer = c.IDCustomer
    LEFT JOIN fact.H80Row_TB h80 on h80.IDInsurance = i.IDInsurance
    LEFT JOIN fact.WinsureRow_TB winsure on winsure.IDInsurance = i.IDInsurance
    LEFT JOIN eb.User_TB a on i.LockedByUserID = a.IDUser
    LEFT JOIN eb.Department_TB dept on dept.IDDepartment = a.IDDepartment
WHERE c.IDCustomer = myID

まず、EF クエリに何か問題がありますか? SP を作成することはできますが、その結果セットから POCOS を埋めるにはどうすればよいでしょうか?

4

2 に答える 2

0

SingleOrDefault を Where に変更します。SingleOrDefault は同じではありません。最大で 1 行を保証します。

Sql Profiler および/またはで発行されている sql を確認することもできますvar sql = ((System.Data.Objects.ObjectQuery)customerEngage).ToTraceString();

于 2013-10-28T08:13:44.733 に答える
0

これらすべてのインクルードは必要ありません。

var customerEngage = ctx.Customer_TB
                        .SingleOrDefault(c => c.IDCustomer == myID);

仕事をするべきです。

于 2013-10-28T08:18:18.613 に答える