在使用Linq to Sql的时候,进行两个表的左连接的时候要注意defaultifempty的使用,这个函数本来的意思即是:如果为空则使用默认值代替,默认值为 NULL ,当然也可以使用defaultifempty的另一个重载指定默认。如要了解该函数的详细使用,请看文档:http://msdn.microsoft.com/zh-cn/library/system.linq.enumerable.defaultifempty.aspx

看下面的例子:

var q = (from c in
                         (from a1 in db.StoreIns 
                          group a1 by a1.StoreNum into g 
                          select new { storenum = g.Select(p => p.StoreNum).FirstOrDefault(), total = g.Sum(p =>                                        p.Quantity) })
                     join d in
                         (from a2 in db.StoreOuts
                          group a2 by a2.StoreNum into g2
                          select new { storeNum = g2.Select(p => p.StoreNum).FirstOrDefault(), totalout = g2.Sum(p                          => p.Quantity) }) on c.storenum
                     equals d.storeNum into ord 
                     from t in ord.DefaultIfEmpty()
                     select new 
                     {
                         storeNum = c.storenum,
                         actalIn=c.total,
                         actualOut= (t.totalout==null) ? 0 :t.totalout,
                         actualNum = c.total - ((t.totalout==null) ? 0 :t.totalout)
                     }).ToList();

分解解释:

(1)

from a1 in db.StoreIns 
                          group a1 by a1.StoreNum into g 
                          select new { storenum = g.Select(p => p.StoreNum).FirstOrDefault(), total = g.Sum(p =>                                        p.Quantity) }

表示在入库表中按照库的编号StorNum进行分组统计每个库的实际总量,通过匿名类设置了两个属性:storenum和total。需要特别注意的是按照分组统计之后,会形成storenum和total的关系是 : 多对一的关系,并且这些storenum是相同的值, 为了后面要进行的左连接,需要取出storenum,此时只能调用FirstOrDefault()函数而不能调用Fisrt(),因为Fisrt()取得是storenum对象,这个对象了存储的是多个相同的值,在后面得左连接就无法进行。

(2)

from a2 in db.StoreOuts
                          group a2 by a2.StoreNum into g2
                          select new { storeNum = g2.Select(p => p.StoreNum).FirstOrDefault(), totalout = g2.Sum(p                          => p.Quantity) }

表示在出库表中按照库编号进行分组统计每个库的实际总量。

(3)

下面要对上述两步查询的到数据进行左连接。

from c in
                         (from a1 in db.StoreIns 
                          group a1 by a1.StoreNum into g 
                          select new { storenum = g.Select(p => p.StoreNum).FirstOrDefault(), total = g.Sum(p =>                                        p.Quantity) })
                     join d in
                         (from a2 in db.StoreOuts
                          group a2 by a2.StoreNum into g2
                          select new { storeNum = g2.Select(p => p.StoreNum).FirstOrDefault(), totalout = g2.Sum(p                          => p.Quantity) }) on c.storenum
                     equals d.storeNum into ord 
                     from t in ord.DefaultIfEmpty()
                     select new 
                     {
                         storeNum = c.storenum,
                         actalIn=c.total,
                         actualOut= (t.totalout==null) ? 0 :t.totalout,
                         actualNum = c.total - ((t.totalout==null) ? 0 :t.totalout)
                     }

在上面要注意的是d的访问范围,当……into ord……后,只能使用t来访问数据。如下的访问方式就是错误的:actual=c.total-((d.totalout==null)?0:d.totalout) 就会提示上下文不存在d的错误提示。

这句表示的是使用(1)中数据左连接(2)中的数据。如果(2)中的相关项不存在则使用默认值NULL代替。

关于Linq to Sql 中的left join 中defaultifempty的相关注意事项的更多相关文章

  1. Linq to Sql:N层应用中的查询(上) : 返回自定义实体

    原文:Linq to Sql:N层应用中的查询(上) : 返回自定义实体 如果允许在UI层直接访问Linq to Sql的DataContext,可以省去很多问题,譬如在处理多表join的时候,我们使 ...

  2. Linq to Sql:N层应用中的查询(下) : 根据条件进行动态查询

    原文:Linq to Sql:N层应用中的查询(下) : 根据条件进行动态查询 如果允许在UI层直接访问Linq to Sql的DataContext,可以省去很多问题,譬如在处理多表join的时候, ...

  3. LINQ to SQL语句(4)之Join

    适用场景:在我们表关系中有一对一关系,一对多关系,多对多关系等.对各个表之间的关系,就用这些实现对多个表的操作. 说明:在Join操作中,分别为Join(Join查询), SelectMany(Sel ...

  4. linq中如何在join中指定多个条件

    public ActionResult Edit(int id) { using (DataContext db = new DataContext(ConfigurationManager.Conn ...

  5. sql语句中给列参数取别名及相关注意事项

    1.使用双引号 select count(*) "总数" from table: 2.使用单引号 select count(*) '总数' from table: 3.直接加别名, ...

  6. 年终巨献 史上最全 ——LINQ to SQL语句

    LINQ to SQL语句(1)之Where 适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的子句.Where操 ...

  7. LINQ TO SQL 大全

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精 LINQ to SQL语句(1)之Where 适用场景: ...

  8. LINQ to SQL大全

    LINQ to SQL语句 (1)之Where Where操作 适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的 ...

  9. [转]LINQ To SQL 语法及实例大全

    转载自:http://blog.csdn.net/pan_junbiao/article/details/7015633 LINQ to SQL语句(1)之Where Where操作 适用场景:实现过 ...

随机推荐

  1. nagios监控redis

    nagios是非常强大的监控工具,但是它本身没有监控redis的功能 但是网上有很多大神写了监控redis的插件,比较热门的使用perl写的check_redis.pl 但是由于我们监控mongodb ...

  2. JavaScript面向对象总结

    对象(Object)应该算是js中最为重要的部分,也是js中非常难懂晦涩的一部分.更是面试以及框架设计中各出没.本文章,主要参考JavaScript红宝书(JavaScript高级程序设计 第六章)以 ...

  3. 【AS3 Coder】任务四:噪音的魅力(上)

    使用框架:AS3任务描述:使用AS3中BitmapData的noise方法以及perlinNoise方法构建自然景观效果以及其他一些比较cool的效果难度系数:2 本文章源码下载:www.iamsev ...

  4. Kubernetes概念介绍和v1版本部署过程

    简介: k8s一个开源的,跨主机管理容器应用集群的编排系统,为应用提供了基础的部署.维护和扩缩容机制. 编排:跨Docker主机同一管理容器集群. 目的 简化开发和运维容器集群的工作. 让开发和运维能 ...

  5. Scala实现冒泡排序、归并排序和快速排序

    1.冒泡排序 def sort(list: List[Int]): List[Int] = list match { case List() => List() case head :: tai ...

  6. mahout运行测试与数据挖掘算法之聚类分析(一)kmeans算法解析

    在使用mahout之前要安装并启动hadoop集群 将mahout的包上传至linux中并解压即可 mahout下载地址: 点击打开链接 mahout中的算法大致可以分为三大类: 聚类,协同过滤和分类 ...

  7. JavaScriptCore全面解析 (上篇)

    收录待用,修改转载已取得腾讯云授权 作者 | 殷源 编辑 | 迷鹿 殷源,专注移动客户端开发,微软Imagine Cup中国区特等奖获得者,现就职于腾讯. JavaScript越来越多地出现在我们客户 ...

  8. oracle 存储过程的一个小问题

    在存储过程中,一般不能直接使用DDL语句,需要借助 execute immediate方法,否则可能报 pls00103错误 例子如下: create or replace procedure rt_ ...

  9. Windows如何自定义U盘盘符、文件夹图标、文件夹背景

    自定义U盘盘符.文件夹图标.文件夹背景 注意对于Vista和Win7的用户不支持文件夹图标和文件夹背景的更换 1.自定义盘符:在U盘根目录下新建文件 autorun.inf(可先建.txt文本文档,再 ...

  10. MPTCP 源码分析(五) 接收端窗口值

    简述:      在TCP协议中影响数据发送的三个因素分别为:发送端窗口值.接收端窗口值和拥塞窗口值. 本文主要分析MPTCP中各个子路径对接收端窗口值rcv_wnd的处理.   接收端窗口值的初始化 ...