ef實現左關聯查詢


在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 //這里dc就相當於d from dci in dc.DefaultIfEmpty()  //這里dci就相當於dc,所以dci就相當於d,DefaultIfEmpty(),它的作用是當連接的表為空時也會有一條空的數據,達到了left join的效果 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的效果。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM