Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF linq语句未生成嵌套选择计数(*)_C#_Entity Framework_Linq_.net Core_Linq To Sql - Fatal编程技术网

C# EF 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 ()); 这是可

我们有一个表的项目,可以有一些图片附加到他们。我想创建一个端点,它返回所有项目以及作为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`
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查询中键入所有
项的属性的最好方法。