首页 新闻 会员 周边 捐助

EF中这段LinQ代码该如何优化?

0
悬赏园豆:30 [已解决问题] 解决于 2014-09-02 08:45

业务逻辑:

1、计划联系客户集合

2、已联系客户集合(有联系日期 OccurDate)

 

要求:给出指定日期,获得计划联系但未联系的客户集合。

 

当前代码:

            //计划联系日期,默认为当天
            if (!willTelDate.HasValue)
            {
                willTelDate = DateTime.Today;
            }
            var beginDate = willTelDate.Value.Date;
            var endDate = willTelDate.Value.Date.AddDays(1);

            //指定日期计划联系但未联系客户集合
            var willTelUntelQuery = willTelQuery.Where(x => !_telInfoRepository.Table
                                                                        .Where(t => t.CustomerId == x.Id)
                                                                        .Where(t => t.OccurDate >= beginDate && t.OccurDate < endDate)
                                                                        .Any()
                                                       );


这里用到Any,性能打了折扣(或者没打折扣?确认下),想进一步优化。

 

分数计划30分,暂时不悬赏。

 

谢谢。

519740105的主页 519740105 | 大侠五级 | 园豆:5810
提问于:2014-09-01 18:19
< >
分享
最佳答案
1

var willTelUntelQuery = willTelQuery.Where(x=>!_telInfoRepository.Table.Any(t=>t.CustomerId==x.Id && t=>t.OccurDate>=beginDate && t.OccurDate<endDate))

龙卷风摧毁停车场! | 菜鸟二级 |园豆:210 | 2014-09-01 18:34

你这个的性能跟我的一样吧?我不确定。

我是怕any是求结果的方法,是否会导致查询的立即执行。

换句话说,我希望这个查询在执行的时候只是执行了一次SQL语句,而不是执行多次。

 

非常感谢!

519740105 | 园豆:5810 (大侠五级) | 2014-09-01 18:36

@519740105: Any是延时执行的。。好像只有ToList(),ToArray() 这些方法会立即执行。另外即便是立即执行,这个SQL语句也是执行一次啊。

龙卷风摧毁停车场! | 园豆:210 (菜鸟二级) | 2014-09-01 18:38

@咦?: 本质上,你的写法跟我的写法是一样的。

519740105 | 园豆:5810 (大侠五级) | 2014-09-01 18:40

@519740105: 你看一下生成的SQL语句就,应该不一样。。

龙卷风摧毁停车场! | 园豆:210 (菜鸟二级) | 2014-09-01 18:41

@咦?: 也许生成的语句会有区别,但处理逻辑是一样的。

刚检查了我的代码生成的SQL,是能一次性完成,也就是说我的linq也是OK的。

 

感谢关注!

519740105 | 园豆:5810 (大侠五级) | 2014-09-02 08:45

@咦?: 奇怪,怎么没给你分?

519740105 | 园豆:5810 (大侠五级) | 2014-09-02 08:46
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册