首页 新闻 会员 周边

linq to sql怎么做左连接?

0
[已解决问题] 解决于 2014-01-13 08:55

我遇到下面这样的问题,请大牛帮忙分析一下?

业务表两个:项目表和预警表

项目表存放跟项目有关系的基本信息,预警表存放某个项目的预警情况,关联外键是项目的id,意即projectid,我在程序里使用如下的代码对两个表进行连接:

var query_alarm_group = query_alarm.GroupBy(x => x.ProjectID).Select(al => new { ProjectID = al.Key, Count = al.Count(), AlarmTime = al.Max(x => x.AlarmTime) });//预警表进行分组
//表之间 进行内连接
var query_result = query.Join(query_alarm_group, p => p.ID, a => a.ProjectID, (p, a) => new ProjectAlarm
{
Project = p,
AlarmCount = a.Count,
AlarmTime = a.AlarmTime
});


//项目和预警数进行左连

var query_resultTest =
from bp in query
join ba in query_alarm_group on bp.ID equals ba.ProjectID into queryResult
from br in queryResult
select new ProjectAlarm
{
Project = bp,
AlarmCount = br.Count,
AlarmTime = br.AlarmTime
};//ProjectAlarm一个视图模型意即类实体


//查询项目数据的总记录数
int recordCount = query_result.Count();

借助于sql server分析器拿到生成的sql语句都是内连接,求解释为什么?怎么做左连接,谢谢!

问题补充:

我用最笨的方法验证,往预警表里面添加数据,sqlserver分析器追踪生成的sql语句都是内连接,换用外网数据库,意即预警表里面的数据达到6686条时,追踪到的sql语句是左连接的,简单结论:sqlserver或linq to sql有一定的智能性,使用上面的两种方式会自动选择多张表的连接方式以生成执行的sql语句,有遇到同样问题的没求解释?

yss小虾米的主页 yss小虾米 | 菜鸟二级 | 园豆:238
提问于:2013-12-14 13:38
< >
分享
最佳答案
0

使用下面的代码试试

var query_resultTest =
from bp in query
join ba in query_alarm_group on bp.ID equals ba.ProjectID into queryResult
from br in queryResult.DefaultIfEmpty()
select new ProjectAlarm
{
Project = bp,
AlarmCount = br.Count,
AlarmTime = br.AlarmTime
};//ProjectAlarm一个视图模型意即类实体

奖励园豆:5
诶碧司 | 小虾三级 |园豆:1912 | 2013-12-14 20:06

DefaultIfEmpty()这个方法不影响的。linq 方法在一些特定的方法下才会去执行,比如:ToList()...表示统计的方法、转换的方法才会去真正执行操作(延迟处理),DefaultIfEmpty只是在左连接为空对象时会返回一个空的序列。

上面的问题解决了,我用最笨的方法向预警表里添加数据,用sqlserver分析器追踪生成的sql语句,竟然等数据量达到几百时,有生成左连接的sql语句,还没找到原因

yss小虾米 | 园豆:238 (菜鸟二级) | 2013-12-17 09:08
其他回答(1)
0

看一下我这个帖子吧,

描盲贴

http://www.cnblogs.com/li-peng/p/3441729.html

li-peng | 园豆:954 (小虾三级) | 2013-12-16 14:23

谢谢了

支持(0) 反对(0) yss小虾米 | 园豆:238 (菜鸟二级) | 2013-12-17 09:08
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册