我正处于一个项目中,我对数据库结构没有任何控制权。我从数据库创建了我的模型,下面的所有表都有外键。除了用户表之外,每个表中大约有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?
答案 0 :(得分:0)
将SingleOrDefault更改为Where - 您的SingleOrDefault不相同,它最多确保一行。
您还可以检查使用Sql Profiler和/或var sql = ((System.Data.Objects.ObjectQuery)customerEngage).ToTraceString();
答案 1 :(得分:0)
您不需要所有这些包含。
var customerEngage = ctx.Customer_TB
.SingleOrDefault(c => c.IDCustomer == myID);
应该做的。