我们有一个项目表,其中可以附加许多图像。我想创建一个端点,该端点返回所有项目以及作为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;
答案 0 :(得分:1)
我通过生成图像字典来解决性能问题 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干净得多