EF的Join()和Include()差異性教程


在EF中表連接常用的有Join()和Include(),兩者都可以實現兩張表的連接,但又有所不同。

1.Join(),兩表不必含有外鍵關系,需要代碼手動指定連接外鍵相等(具有可拓展性,除了值相等,還能指定是>,<以及其他對兩表的相應鍵的關系),以及結果字段。

2.Include(),兩表必須含有外鍵關系,只需要指定鍵名對應的類屬性名即可,不需指定結果字段(即全部映射)。默認搜索某表時,不會順帶查詢外鍵表,直到真正使用時才會再讀取數據庫查詢;若是使用 Include(),則會在讀取本表時把指定的外鍵表信息也讀出來。

Include

1、現在有三張表

Math_RoleInfo 角色表

Math_User_Role_Select 用戶角色選擇表

Math_UserInfo 用戶表

 

如何通過單個角色,獲取用戶信息呢。通過EF。

C#代碼如下

  Guid id = Guid.Parse("815D30FB-1050-413D-9E19-D8CBDC434E7C");
            MathRoleAuthorEntities context = new MathRoleAuthorEntities();
            List<Math_RoleInfo> list = context.Math_RoleInfo
.Include("Math_User_Role_Select")
.Include("Math_User_Role_Select.Math_UserInfo")
.Where(item => item.RoleId== id)
.ToList
<Math_RoleInfo>(); Console.ReadKey();

第一次的include是單級的導航屬性,

第二次include是多級的導航屬性。中間用.進行級別的傳遞。

代碼和數據庫可以向我索取 

qq:840189859

JOIN

在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的效果。

 


免責聲明!

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



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