2017-05-04 48 views
2

所以基本上我有一个包含一组数据的表。然后将这些数据加入到多个用户可以分开的组织表中。然后,我试图让用户执行查询的表中的所有文件都有权访问组织。为此,我使用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(); 

takecount在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. 
+0

它在我的测试中转换为SQL(EF Core v1.1.1) –

+0

这是一个有希望的消息!我没有意识到发布了一个修补程序。我目前正在运行1.1.0,所以我会尝试升级并回复你。谢谢(你的)信息。 –

+0

不幸的是,这并没有解决我的问题。 –

回答

4

的警告是误导性的 - 问题是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核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] 
+1

谢谢,我欠你一杯啤酒。 –

相关问题