关于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操作 适用场景:实现过 ...
随机推荐
- 怎样用bat批量重命名文件夹和文件
很早以前本人写过重命名文件夹的文章,发现其中稍有不完善的地方,其主要功能在文件夹名前统一加上字符,或者在文件夹名后统一加上字符,有网友反应功能太单一.今天我又仔细研究了一下bat批处理代码,分别能完全 ...
- Yii添加验证码
添加带验证码的登陆: 1.先在模型modules下的LoginForm.php定义一个存储验证码的变量:public $verfyCode: 2.然后在rules()方法里定义:array('veri ...
- Kubernetes用户指南(一)--快速开始、使用k8s配置文件
一.快速开始 1.启动一个简单的容器. 一旦在container中打包好应用并将其commit为image之后,你就可以将其部署在k8s集群上. 一个简单的nginx服务器例子: 先决条件:你需要拥有 ...
- 倍福TwinCAT(贝福Beckhoff)应用教程13.1 TwinCAT控制松下伺服 NC高级
本节主要演示了使用自定义函数实现电机的运动(梯形曲线和S曲线都有实现),这里的JOG+和JOG-,针对单个关节实现了PTP的运动(跟贝福的MoveAbsolute功能块实现效果一致),在此没有介绍运动 ...
- 关于窗体跟随与 PointToScreen
今日写一段测试代码,实现的功能是,当一个输入框获得焦点时,某个帮助窗体跟随在其下方显示.代码很简单,本来没有什么值得一提的.但实验的时候发现,有些控件能较好地跟随,但有些不能,而且距离十分远. 主要代 ...
- Visual studio C++ MFC之树形控件Tree Control
背景 本篇旨在MSDN帮助文档下总结树形控件Tree Control的使用,并列出碰到的具体问题. 正文 树形控件Tree Control的类则是CTreeCtrl,具体成员对象详见链接,以下则描述一 ...
- 电脑 F键(功能键)的具体作用
F1:如果你处在一个选定的程序中而需要帮助,那么请按下F1.如果现在不是处在任何程序中,而是处在资源管理器或桌面,那么按下F1就会出现Windows的帮助程序.如果你正在对某个程序进行操作,而想得到W ...
- HTML5之坦克大战游戏开发
1.在使用arc方法进行画圆时,在IE9+,FF,Safari,Chrome等已经支持HTML5标准的浏览器中进行渲染时,采用逆时针方向画时,也就是说 arc(x, y, radius, startA ...
- 一种在MVC3框架里面设置模板页的方法,不使用_ViewStart
1.新建MasterFilterAttribute类继承ActionFilterAttribute,重写方法OnActionExecuted ,指定ViewResult的MasterName = &q ...
- springboot学习(九) 使用mybatis访问数据库
1.添加maven依赖 <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId ...