EF的左连接查询

摘要:
实际上leftjoin(左联接)才是我们想要的,那么怎么样才能生成leftjoin查询呢?

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

免责声明:文章转载自《EF的左连接查询》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【Maven】CentOS7使用Nexus3搭建maven私服GBT28181中的RTP下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

python 多进程

1.进程的创建 frommultiprocessing import Process import time,os def Hi(name): time.sleep(3) print("Hello %s" %name,time.ctime()) print("进程号是 ",os.getpid()) if __name__=="__...

MySql的join(连接)查询 (三表 left join 写法)

1、内连接:将两个表中存在连结关系的字段符合连接条件的记录形成记录集 Select A.name,B.name from A inner join B on A.id=B.id和 Select A.name,B.name from A,B where A.id=B.id结果是一样的(内连接的inner关键字可省略); 2、外连接:分为左外连接和右外连接 左...

sql级联查询 join

昨晚参加了一个公司的笔试,里面有一题考察了sql语句的书写,内容如下 假设有两个表tableA(id,name,……)tableB(id,……),tableA与tableB中的id一致,此时的查询语句可表示为: select * from tableA join tableB on tableA.id=talbeB.id 问题延伸,若两个表中一致的字段名称...

Delete from join 用法

delete (别名) from tblA (别名) left join tblb (别名) on。。。用法 1、创建使用的表及数据 CREATE TABLEYSHA ( code VARCHAR(10), NAME VARCHAR(20) ) CREATE TABLEYSHB ( code VARCHAR(10),...

teradata中EXPLAIN执行计划总结

对于teradata SQL级别的优化,使用EXPLAIN查看执行计划基本上是最直接也最好用的。EXPLAIN 展示出来的内容重要但同时也很多,我们只需要提取其中的关键字便可大致描述出来我么SQL的执行过程。 数据检索涉及到AMPs: All-AMPs retrieve step, Single-AMP retrieve step等这些内容表明了我们的SQ...

js和java中使用join来进行数组元素的连接

  合理地使用join来进行数组中元素的连接,代码简洁,比自己编码也更为方便。   js中join的用法 var arr = new Array(3) arr[0] = "a" arr[1] = "b" arr[2] = "c" arr.join(".") a.b.c ------------------ arr.join(",") a,b,c   ja...