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

在EF中表链接经常使用的有Join()和Include(),二者均可以实现两张表的链接,但又有所不一样。数据库

1.Join(),两表没必要含有外键关系,须要代码手动指定链接外键相等(具备可拓展性,除了值相等,还能指定是>,<以及其余对两表的相应键的关系),以及结果字段。ui

2.Include(),两表必须含有外键关系,只须要指定键名对应的类属性名便可,不需指定结果字段(即所有映射)。默认搜索某表时,不会顺带查询外键表,直到真正使用时才会再读取数据库查询;如果使用 Include(),则会在读取本表时把指定的外键表信息也读出来。spa

Includecode

一、如今有三张表blog

Math_RoleInfo 角色表ci

Math_User_Role_Select 用户角色选择表string

Math_UserInfo 用户表it

 

如何经过单个角色,获取用户信息呢。经过EF。io

C#代码以下class

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

相关文章
相关标签/搜索