[英]EF linq statement not generating nested select count(*)
我们有一个项目表,其中可以附加许多图像。 我想创建一个端点,它返回所有项目以及附加到每个项目的图像数量为 json。
我使用以下 linq 语句执行此操作:
var items = context.Items.AsNoTracking ();
return Json (await items.Select (item => new {
item = item,
numImages = item.Images.Count (),
}).ToListAsync ());
这可行,但速度非常慢,因为 EF 为每个项目生成一个单独的 SQL 语句,如下所示:
SELECT COUNT(*) FROM `Images` AS `q0` WHERE @_outer_IdImages = `q0`.`idImages`
如何构造我的 linq 以便只生成一个查询,如下所示:
SELECT idItems, name, (SELECT COUNT(*) FROM Images WHERE idItems = i.idItems) FROM Items i;
我通过生成一个图像 idItems 字典来解决性能问题,如下所示:
var items = context.Items.AsNoTracking ();
var imagesDict = await context.Images.AsNoTracking ()
.GroupBy (img => img.IdItems)
.ToDictionaryAsync (g => g.Key, g => g.Count ());
return Json (await items.Select (item => new {
item = item,
numImages = imagesDict.GetValueOrDefault (item.IdItems, 0),
}).ToListAsync ());
这根本不是我想要的,但它最终会快得多,因为只运行了两个 DbCommand。 而且比原始的 SQL 干净很多
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.