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

 

posted on 2018-02-26 14:26  漫思  阅读(2958)  评论(0编辑  收藏  举报

导航