C# EF linq语句未生成嵌套选择计数(*)
我们有一个表的项目,可以有一些图片附加到他们。我想创建一个端点,它返回所有项目以及作为json附加到每个项目的图像数量 我使用以下linq语句执行此操作:C# EF linq语句未生成嵌套选择计数(*),c#,entity-framework,linq,.net-core,linq-to-sql,C#,Entity Framework,Linq,.net Core,Linq To Sql,我们有一个表的项目,可以有一些图片附加到他们。我想创建一个端点,它返回所有项目以及作为json附加到每个项目的图像数量 我使用以下linq语句执行此操作: var items = context.Items.AsNoTracking (); return Json (await items.Select (item => new { item = item, numImages = item.Images.Count (), }).ToListAsync ()); 这是可
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`
SELECT idItems, name, (SELECT COUNT(*) FROM Images WHERE idItems = i.idItems) FROM Items i;
如何构造我的linq,以便只生成一个查询,如下所示:
SELECT COUNT(*) FROM `Images` AS `q0` WHERE @_outer_IdImages = `q0`.`idImages`
SELECT idItems, name, (SELECT COUNT(*) FROM Images WHERE idItems = i.idItems) FROM Items i;
我已经通过生成图像字典解决了性能问题 idItems到Counts,如下所示:
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 ());
这根本不是我想要的,但它最终要快得多,因为只运行两个DbCommands。而且它比原始SQL干净得多使用原始SQL查询?哪个EF版本?您是否尝试过
。在之前包含(item=>item.Images)
。选择()
?@GertArnold Entity Framework Core 2.2.6-servicing-10079使用EF Core 2,您必须解决解决解决方法。查询翻译的问题非常严重。我在EF3中看到的,它变得好多了。解决方法是选择项目的属性,而不是项目本身。可能是避免在LINQ或原始SQL查询中键入所有项的属性的最好方法。