gpt4 book ai didi

c# - Entity Framework 核心缺乏适度 LINQ 查询支持的最佳解决方案是什么?

转载 作者:行者123 更新时间:2023-11-30 20:31:06 25 4
gpt4 key购买 nike

所以基本上我有一个包含一组数据的表。然后将此数据加入一个组织表,多个用户可以从该表中分离出来。然后,我试图获取执行查询的用户有权访问组织的表中的所有文件。为此,我使用了一个 where 子句来检查应用程序的用户权限,以及与组织链接的文件。然后我选择前 100 个结果并计算返回的记录。 (我想看看用户是否可以访问所有组织的 100 多个文件)。

问题出在我使用以下 LINQ 查询时:

(from f in File
join o in Organisation on f.OrganisationId equals o.Id
where permissions.Contains(o.Id.ToString())
select f).Take(100).Count();

takecount不在 SQL 服务器上执行,而是在内存中运行,当我尝试在列表中包含一个应该转换为 IN (VALUES) 的列表时SQL查询。我有 70,000 多条文件记录,这在 Web 服务器上非常慢并且超时。这是预期的,因为 Entity Framework 核心处于早期阶段,尚不支持中等或高级 LINQ 查询。

我的问题是,是否有比原始 SQL 查询更好的替代方法,同时仍然能够按项目数组进行过滤并仍然使用 Entity Framework core v1.1?谢谢。

编辑:我尝试更新到最新版本,这仍然没有解决我的问题,因为我仍然得到以下输出。

The LINQ expression '{permissions => Contains([o].Id.ToString())}' could not be translated and will be evaluated locally.
The LINQ expression 'Contains([o].Id.ToString())' could not be translated and will be evaluated locally.
The LINQ expression 'Take(__p_1)' could not be translated and will be evaluated locally.
The LINQ expression 'Count()' could not be translated and will be evaluated locally.

最佳答案

警告具有误导性 - 问题是 ToString() 调用导致客户端对查询进行评估。

以下应生成预期的 SQL 查询:

var idList = permissions.Select(int.Parse);
var result = (
from f in File
join o in Organisation on f.OrganisationId equals o.Id
where idList.Contains(o.Id)
select f).Take(100).Count();

在我的环境 (EF Core v1.1.1) 中生成以下 SQL 而没有警告(如预期的那样):

SELECT COUNT(*)
FROM (
SELECT TOP(@__p_1) [f].[Id], [f].[Name], [f].[OrganisationId]
FROM [Files] AS [f]
INNER JOIN [Organisations] AS [o] ON [f].[OrganisationId] = [o].[Id]
WHERE [o].[Id] IN (1, 3, 4)
) AS [t]

关于c# - Entity Framework 核心缺乏适度 LINQ 查询支持的最佳解决方案是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43779634/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com