关于Linq to Sql 中的left join 中defaultifempty的相关注意事项
在使用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的相关注意事项的更多相关文章
- Linq to Sql:N层应用中的查询(上) : 返回自定义实体
原文:Linq to Sql:N层应用中的查询(上) : 返回自定义实体 如果允许在UI层直接访问Linq to Sql的DataContext,可以省去很多问题,譬如在处理多表join的时候,我们使 ...
- Linq to Sql:N层应用中的查询(下) : 根据条件进行动态查询
原文:Linq to Sql:N层应用中的查询(下) : 根据条件进行动态查询 如果允许在UI层直接访问Linq to Sql的DataContext,可以省去很多问题,譬如在处理多表join的时候, ...
- LINQ to SQL语句(4)之Join
适用场景:在我们表关系中有一对一关系,一对多关系,多对多关系等.对各个表之间的关系,就用这些实现对多个表的操作. 说明:在Join操作中,分别为Join(Join查询), SelectMany(Sel ...
- linq中如何在join中指定多个条件
public ActionResult Edit(int id) { using (DataContext db = new DataContext(ConfigurationManager.Conn ...
- sql语句中给列参数取别名及相关注意事项
1.使用双引号 select count(*) "总数" from table: 2.使用单引号 select count(*) '总数' from table: 3.直接加别名, ...
- 年终巨献 史上最全 ——LINQ to SQL语句
LINQ to SQL语句(1)之Where 适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的子句.Where操 ...
- LINQ TO SQL 大全
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精 LINQ to SQL语句(1)之Where 适用场景: ...
- LINQ to SQL大全
LINQ to SQL语句 (1)之Where Where操作 适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的 ...
- [转]LINQ To SQL 语法及实例大全
转载自:http://blog.csdn.net/pan_junbiao/article/details/7015633 LINQ to SQL语句(1)之Where Where操作 适用场景:实现过 ...
随机推荐
- 用Storyboard构建标签栏多页面应用程序UI
注: 貌似CSDN的显示效果不佳,假设有须要的话我能够上传pdf格式的: 另外假设文章中有错误还请给位多多提意见,谢谢. pdf格式文档:http://download.csdn.net/detail ...
- KVO(Key Value Observing)
*KVO能够监听某个对象属性的改变 原理:仅仅要给一个对象注冊一个监听,那么在执行时, 系统就会自己主动给该对象生成一个子类对象,而且重写自己主动生成的子类对象的被监听属性的set方法.然后在set方 ...
- Spark(三) -- Shark与SparkSQL
首先介绍一下Shark的概念 Shark简单的说就是Spark上的Hive,其底层依赖于Hive引擎的 但是在Spark平台上,Shark的解析速度是Hive的几多倍 它就是Hive在Spark上的体 ...
- e.which
e.which is not an event, which is a property of the event object, which most people label as e in th ...
- MoveSessionRestore.bat for firefox
move "c:\Documents and Settings\leon\Application Data\Mozilla\Firefox\Profiles\eyr6cp34.default ...
- ThreadLocal的实现原理(读书笔记)
ThreadLocal的set方法和get方法,从set方法开始: public void set(T value) { Thread t = Thread.currentThread();//获取当 ...
- SQLCMD Mode: give it one more chance
From : http://sqlblog.com/blogs/maria_zakourdaev/archive/2012/05/11/sqlcmd-mode-give-it-one-more-cha ...
- 一张图片教会你写mysql 语句
MySQL的语句执行顺序 MySQL的语句一共分为11步,如下图所标注的那样,最先执行的总是FROM操作,最后执行的是LIMIT操作.其中每一个操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入 ...
- Spring整合Activiti工作流
代码地址如下:http://www.demodashi.com/demo/11911.html 一. 前期准备 安装必要的开发环境 eclipse/intellij+maven 3.5.x + tom ...
- 关于继承Fragment后重写构造方法而产生的错误
在android开发中.写了一个关于继承Fragment的类时,假设有重载构造函数时.会提示"Avoid non-default constructors in fragments: use ...