在EF中,當在dbset使用join關聯多表查詢時,連接查詢的表如果沒有建立相應的外鍵關系時,EF生成的SQL語句是inner join(內聯),對於inner join,有所了解的同學都知道,很多時候這並不是我們的本意,實例如下:
var list = from o in context.CTMS_OD_ORDERS
join d in context.CTMS_SUP_DOCTOR
on o.OWNERDOCID equals d.USERID
join e in context.CTMS_OD_ORDERSEVALUATION
on o.ORDERID equals e.ORDERID
select o;`
EF生成了內連接(inner join)查詢,當兩個表的任一表的數據不匹配時,查詢結果就為空!實際上left join(左聯接)才是我們想要的,那么怎么樣才能生成left join查詢呢?其實只要我們如下改造,EF就能為我們生成left join(左聯接)查詢!
data = from o in context.CTMS_OD_ORDERS
join d in context.CTMS_SUP_DOCTOR
on o.OWNERDOCID equals d.USERID into dc
from dci in dc.DefaultIfEmpty()
join e in context.CTMS_OD_ORDERSEVALUATION
on o.ORDERID equals e.ORDERID into ec
from eci in ec.DefaultIfEmpty()
where o.USERID == userID && (string.IsNullOrEmpty(type) || o.PRODUCTNAME.Contains(type))
select new ODOrders
{
BalanceStatus = o.BALANCESTATUS,
ChannelOrderID = o.CHANNELORDERID,
ChannelType = o.CHANNELTYPE,
CreateDateTime = o.CREATEDATETIME,
CreateUserID = o.CREATEUSERID,
CreateUserName = o.CREATEUSERNAME,
DocName = dci.DOCNAME,
EvalutionStatus = string.IsNullOrEmpty(eci.ORDERID) ? "0" : "1",
PayTime = o.PAYTIME,
ProductCode = o.PRODUCTCODE,
ProductName = o.PRODUCTNAME,
ProductInstanceId = o.PRODUCTINSTANCEID,
ProductID = o.PRODUCTID,
OrderID = o.ORDERID,
OrderCode = o.ORDERCODE,
OrderStatus = o.ORDERSTATUS,
OrderType=o.ORDERTYPE,
TotalFee = o.TOTALFEE,
UserID=o.USERID,
UserName=o.USERNAME
};
對比上下兩種寫法,可以看到在on表的后面我們加上了into xx
,還有不要忘記,還需加上from xxx in xx.DefaultIfEmpty()
,重要的就是最后的xx.DefaultIfEmpty()
,它的作用是當連接的表為空時也會有一條空的數據,達到了left join的效果。