繁体   English   中英

EF linq 语句未生成嵌套 select 计数(*)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM