EF Include的性能问题

时间:2013-10-28 08:11:04

标签: c# sql entity-framework-5

我正处于一个项目中,我对数据库结构没有任何控制权。我从数据库创建了我的模型,下面的所有表都有外键。除了用户表之外,每个表中大约有500k到1000k行,并且它们非常宽。

使用EF5执行此查询需要两秒钟:

 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?

2 个答案:

答案 0 :(得分:0)

将SingleOrDefault更改为Where - 您的SingleOrDefault不相同,它最多确保一行。

您还可以检查使用Sql Profiler和/或var sql = ((System.Data.Objects.ObjectQuery)customerEngage).ToTraceString();

发出的sql

答案 1 :(得分:0)

您不需要所有这些包含。

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

应该做的。