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,只查询一次,多谢。
你这个如果数据一两条或者量不大自然没问题,但是,如果量很大就麻烦咯,我试过,因为这个可能导致性能大大的降低,甚至成为致命点。
解决方案:
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()
});
首先 多谢,这个可以。
另外 我在想这个能不能通过join什么的来写?
@Eysa: 你是不希望Stores里不符合条件的Store不查询出来吧?
你可以这样:
dbContext.Stores.Where(...).Include(x=>x.Client);
ToList后循环再生成。
@519740105: 这样好像达不到上面代码的结果哦。还是第一个好点。
每个Client的Stores是一样的?那可以先一次查出哇。
吧Stores单独查一次?
@Eysa:
抱歉,看错,Stores是放在c上面的。。感觉你这个应该可以用连表查询吧。
@幻天芒: 代码?
@Eysa: Client和Store之间的关系是什么?
@幻天芒: 很明显,主外键关系Client有Store的外键
@Eysa: 那考虑下修改成Join,要不然不能自动生成连接的语句。