C# 对于缺乏适度LINQ查询支持的实体框架核心,最好的解决方案是什么?

C# 对于缺乏适度LINQ查询支持的实体框架核心,最好的解决方案是什么?,c#,.net,sql-server,linq,entity-framework-core,C#,.net,Sql Server,Linq,Entity Framework Core,所以基本上我有一个包含一组数据的表。然后,这些数据被连接到一个组织表中,多个用户可以分离到该组织表中。然后,我尝试获取表中执行查询的用户有权访问组织的所有文件。为此,我使用where子句来检查应用程序中的用户权限,以及链接到这些用户的文件的权限。然后,我选择前100名的结果并计算返回的记录。(我想看看用户是否可以访问所有组织的100多个文件) 问题是当我使用以下LINQ查询时: (from f in File join o in Organisation on f.OrganisationId

所以基本上我有一个包含一组数据的表。然后,这些数据被连接到一个组织表中,多个用户可以分离到该组织表中。然后,我尝试获取表中执行查询的用户有权访问组织的所有文件。为此,我使用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();
在SQL server上不执行
take
count
,而是在我尝试对列表进行包含时在内存中运行,该列表应转换为SQL上的
in(VALUES)
查询。我有70000多条文件记录,速度非常慢,在web服务器上超时。这是预期的,因为实体框架核心处于早期阶段,并且还不支持中等或高级LINQ查询

我的问题是,在仍然能够通过项目数组进行过滤并且仍然使用EntityFramework核心v1.1的情况下,是否有更好的替代原始SQL查询的方法?谢谢

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

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(如预期的那样):


在我的测试(EF Core v1.1.1)中,它被翻译成SQL。啊,这是一个有希望的消息!我没有意识到一个修补程序被发布了。我目前运行的是1.1.0,因此我将尝试升级并与您联系。谢谢你的信息。不幸的是,这并没有解决我的问题。这是真正的疑问吗?
权限
变量的类型是什么?这是具有不同变量名称的真正查询
permissions
是一个
IEnumerable
。谢谢,我欠你一杯啤酒。
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]