我遇到下面这样的问题,请大牛帮忙分析一下?
业务表两个:项目表和预警表
项目表存放跟项目有关系的基本信息,预警表存放某个项目的预警情况,关联外键是项目的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语句,有遇到同样问题的没求解释?
使用下面的代码试试
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一个视图模型意即类实体
DefaultIfEmpty()这个方法不影响的。linq 方法在一些特定的方法下才会去执行,比如:ToList()...表示统计的方法、转换的方法才会去真正执行操作(延迟处理),DefaultIfEmpty只是在左连接为空对象时会返回一个空的序列。
上面的问题解决了,我用最笨的方法向预警表里添加数据,用sqlserver分析器追踪生成的sql语句,竟然等数据量达到几百时,有生成左连接的sql语句,还没找到原因