首页新闻找找看学习计划

求优化,求Linq大神现身。

0
悬赏园豆:20 [已解决问题] 解决于 2015-02-13 13:17

var result = dbContext.Clients.Select(c => new Client
{
  Id = c.Id,
  Name = c.Name,
  Stores = c.Stores.Select(s => new Store { Id = s.Id, UniqueId = s.UniqueId   }).ToList()
});

 

这样是每次转换类型的时候都要执行

c.Stores.Select(s => new Store { Id = s.Id, UniqueId = s.UniqueId }).ToList()

也就是循环查询DB,求个优化后的linq,只查询一次,多谢。

Eysa的主页 Eysa | 初学一级 | 园豆:70
提问于:2015-02-10 14:09
< >
分享
最佳答案
0

你这个如果数据一两条或者量不大自然没问题,但是,如果量很大就麻烦咯,我试过,因为这个可能导致性能大大的降低,甚至成为致命点。

 

解决方案:

1、Client必须跟Store有关联

2、使用Include(System.Data.Entity名称空间)命令:

 

var result = dbContext.Clients.Include(c => c.Stores).Select(c => new Client
{
  Id = c.Id,
  Name = c.Name,
  Stores = c.Stores.Select(s => new Store { Id = s.Id, UniqueId = s.UniqueId   }).ToList()
});

收获园豆:20
519740105 | 大侠五级 |园豆:5810 | 2015-02-11 08:17

首先 多谢,这个可以。

另外 我在想这个能不能通过join什么的来写?

Eysa | 园豆:70 (初学一级) | 2015-02-11 11:08

@Eysa: 你是不希望Stores里不符合条件的Store不查询出来吧?

 

你可以这样:

dbContext.Stores.Where(...).Include(x=>x.Client);

ToList后循环再生成。

519740105 | 园豆:5810 (大侠五级) | 2015-02-11 12:19

@519740105: 这样好像达不到上面代码的结果哦。还是第一个好点。

Eysa | 园豆:70 (初学一级) | 2015-02-11 13:58
其他回答(1)
0

每个Client的Stores是一样的?那可以先一次查出哇。

幻天芒 | 园豆:36544 (高人七级) | 2015-02-10 14:21

吧Stores单独查一次?

支持(0) 反对(0) Eysa | 园豆:70 (初学一级) | 2015-02-10 14:22

@Eysa: 

抱歉,看错,Stores是放在c上面的。。感觉你这个应该可以用连表查询吧。

支持(0) 反对(0) 幻天芒 | 园豆:36544 (高人七级) | 2015-02-10 14:23

@幻天芒: 代码?

支持(0) 反对(0) Eysa | 园豆:70 (初学一级) | 2015-02-10 14:24

@Eysa: Client和Store之间的关系是什么?

支持(0) 反对(0) 幻天芒 | 园豆:36544 (高人七级) | 2015-02-10 14:25

@幻天芒: 很明显,主外键关系Client有Store的外键

支持(0) 反对(0) Eysa | 园豆:70 (初学一级) | 2015-02-10 14:27

@Eysa: 那考虑下修改成Join,要不然不能自动生成连接的语句。

支持(0) 反对(0) 幻天芒 | 园豆:36544 (高人七级) | 2015-02-10 14:32
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册