Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.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核心-具有多对多关系的查询非常慢_C#_Entity Framework Core - Fatal编程技术网

C# EF核心-具有多对多关系的查询非常慢

C# EF核心-具有多对多关系的查询非常慢,c#,entity-framework-core,C#,Entity Framework Core,我想用实体框架核心做一个简单的查询,它涉及多对多关系 目前,查询的执行速度非常慢,因为大部分查询似乎是在本地运行的。我在日志中收到以下警告: The LINQ expression 'where ([categoryId] == [categoryRelationEntity].CategoryId)' could not be translated and will be evaluated locally. The LINQ expression 'Any()' could not be

我想用实体框架核心做一个简单的查询,它涉及多对多关系

目前,查询的执行速度非常慢,因为大部分查询似乎是在本地运行的。我在日志中收到以下警告:

 The LINQ expression 'where ([categoryId] == [categoryRelationEntity].CategoryId)' could not be translated and will be evaluated locally.
 The LINQ expression 'Any()' could not be translated and will be evaluated locally.
 ...
这些警告基本上告诉我,SQL中无法执行任何操作,所有操作都是在本地完成的

以下是我在LINQ中的查询:

var categoryIds = new int[] { 1 , 2 , 3 };
var result = await _dbSet // MyTable
                    .Include(x => x.Categories) // CategoriesRelation
                    .ThenInclude(x => x.CategoryEntity)
                    .AsNoTracking()
                    .Where(x=>  x.Categories
                        .All(categoryRelationEntity => categoryIds.Any(categoryId => categoryId == categoryRelationEntity.CategoryId)))
                    .ToListAsync();
如果我自己编写SQL,它应该如下所示:

SELECT * FROM MyTable
LEFT OUTER JOIN CategoriesRelation ON MyTable.Id = CategoriesRelation.MyTableId
WHERE "CategoryId" IN (1,2,3)
我写LINQ的方式有问题吗?我做了一些研究,发现所有的资源都表明我必须做所有的事情


我尝试了很多不同的方法,但都没有效果。。。我很沮丧,几乎就要用原始sql编写了…

尝试使用CategoryId.ContainesCategoryId方法。任何尝试使用CategoryId.ContainesCategoryId方法。任何从nuget下载Z.EntityFramework.Plus.EFCore。ToListSync会导致性能降低。请改用AsQueryableSync以获得更好的性能。并使用下面的代码

var result = await _dbSet
                   .IncludeFilter(x => x.Categories.Where(x => categoryIds.Contains(x.categoryId)))
                   .ThenInclude(x => x.CategoryEntity).AsQueryableAsync();

从nuget下载Z.EntityFramework.Plus.EFCore。ToListSync会导致性能降低。请改用AsQueryableSync以获得更好的性能。并使用下面的代码

var result = await _dbSet
                   .IncludeFilter(x => x.Categories.Where(x => categoryIds.Contains(x.categoryId)))
                   .ThenInclude(x => x.CategoryEntity).AsQueryableAsync();


你的桌子不清楚。你的linq没有MyTable。您的SQL没有Category和CategoryEntity。可以张贴表格结构来让我们清楚吗?Include、Where和ToList将导致性能降低。使用AsQueryable而不是ToList。您的问题肯定在Where语句中。我不理解你的疑问。ef核心中的多对多通常通过中间的联接表来完成。你在Where方法中做什么?@Asherguru这个_dbSet是MyTable,而.Includex=>x。Categories是Categories关系。@JohanHerstad Categories是介于两者之间的联接表。代码中的名称有点混乱。我添加了两条注释,也许这会使哪个属性是哪个表更清晰一些。where子句应该选择所有MyTable实体,其中该实体的所有类别都在给定的category id数组中。它与SQL查询相同,但速度要慢得多。您的表不清楚。你的linq没有MyTable。您的SQL没有Category和CategoryEntity。可以张贴表格结构来让我们清楚吗?Include、Where和ToList将导致性能降低。使用AsQueryable而不是ToList。您的问题肯定在Where语句中。我不理解你的疑问。ef核心中的多对多通常通过中间的联接表来完成。你在Where方法中做什么?@Asherguru这个_dbSet是MyTable,而.Includex=>x。Categories是Categories关系。@JohanHerstad Categories是介于两者之间的联接表。代码中的名称有点混乱。我添加了两条注释,也许这会使哪个属性是哪个表更清晰一些。where子句应该选择所有MyTable实体,其中该实体的所有类别都在给定的category id数组中。它与SQL查询相同,但速度要慢得多。我不建议安装另一个依赖项来获得简单的。。。在哪里。。。如果没有依赖项,则需要使用2-3行代码来获取该查询,因为过滤器无法在常规Include linq中工作。这只是一个代码行。它确实有效。我想你说的是include的查询性能,因为它们一开始并没有被过滤,所有数据都被加入EF Core>3.0并被查询和过滤。在linq查询的末尾,当这是一个问题时,你是对的,EF Plus对IncludeFilter方法非常有帮助。但这完全是另一个问题。他想提高linq的表现。我为性能截图编辑了我的答案。您可以比较includefilter和常规过滤器的性能。两者都有相同的数据列表。但是includefilter减少了代码和更快的性能。正如我之前的评论一样,我从未怀疑过使用includefilter会提高性能。但你们是对的,这个问题可以理解为一个与性能相关的问题,而不是一个“不工作”的问题。对不起,我昨天错过了。所以我取消了降级,投了赞成票。此外,这段对话可能会为提问者增加价值。我不建议安装另一个依赖项来获得简单的。。。在哪里。。。如果没有依赖项,则需要使用2-3行代码来获取该查询,因为过滤器无法在常规Include linq中工作。这只是一个代码行。它确实有效。我想你说的是include的查询性能,因为它们一开始并没有被过滤,所有数据都被加入EF Core>3.0并被查询和过滤。在linq查询的末尾,当这是一个问题时,你是对的,EF Plus对IncludeFilter方法非常有帮助。但这完全是另一个问题。他想提高linq的表现。我为性能截图编辑了我的答案。您可以比较includefilter和常规过滤器的性能。二者都
有相同的数据列表。但是includefilter减少了代码和更快的性能。正如我之前的评论一样,我从未怀疑过使用includefilter会提高性能。但你们是对的,这个问题可以理解为一个与性能相关的问题,而不是一个“不工作”的问题。对不起,我昨天错过了。所以我取消了降级,投了赞成票。此外,这段对话肯定会给提问者增加价值。肯定是正确的答案。我在很多代码中都用到了这个。更明显的是,它有点像。其中x=>categoryId.Containsx.categoryId…答案绝对正确。我在很多代码中都用到了这个。更明显的是,它有点像。其中x=>categoryId.Containsx.categoryId。。。