所以基本上我有一个包含一组数据的表。然后将这些数据加入到多个用户可以分开的组织表中。然后,我试图让用户执行查询的表中的所有文件都有权访问组织。为此,我使用where子句检查应用程序的用户权限,以及组织链接的文件。我然后选择前100个结果并计算返回的记录。 (我想看看用户是否可以访问超过所有组织的100多个文件)。实体框架核心缺乏适度的LINQ查询支持的最佳解决方案是什么?
问题是,当我使用下面的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();
的take
和count
在SQL服务器上不被执行,并在内存中运行,当我尝试一个包含列表,它应该在在SQL上转换为IN (VALUES)
查询。我有70,000多个文件记录,这非常缓慢,并且在Web服务器上超时。由于实体框架核心处于早期阶段并且不支持中等或高级LINQ查询,因此这是预期的。
我的问题是,是否有原始的SQL查询,同时仍然能够过滤通过的项目的数组,并仍然使用实体框架的核心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.
它在我的测试中转换为SQL(EF Core v1.1.1) –
这是一个有希望的消息!我没有意识到发布了一个修补程序。我目前正在运行1.1.0,所以我会尝试升级并回复你。谢谢(你的)信息。 –
不幸的是,这并没有解决我的问题。 –