免责声明: 我是项目Entity Framework Plus的所有者。
由于存在N+1查询问题,我们的库目前还不支持.NET Core的查询过滤器。
在我们的EF6底层中,我们的库只执行了一个简单的投影操作。
类似于使用您的信息执行以下操作:
var users = _Context.Users.Select(x => new {
Users = x,
Childs = x.Childs.Any(ec => ec.Id > 1)
})
.ToList()
.Select(x => x.Users)
.ToList();
然而,对于 EF Core 来说,相同的投影会为每个用户获取一个子级别的数据库往返(N+1 queries)。
您可以尝试以下投影,并查看是否会出现相同的错误。
我认为,在 EF Core 团队修复此问题之前,据我所知,没有方法可以过滤子实体。
SELECT [x].[Id], [x].[ColumnInt]
FROM [Lefts] AS [x]
go
exec sp_executesql N'SELECT CASE
WHEN EXISTS (
SELECT 1
FROM [Rights] AS [ec1]
WHERE ([ec1].[Id] > 1) AND (@_outer_Id1 = [ec1].[LeftId]))
THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT)
END',N'@_outer_Id1 int',@_outer_Id1=1
go
exec sp_reset_connection
go
exec sp_executesql N'SELECT CASE
WHEN EXISTS (
SELECT 1
FROM [Rights] AS [ec1]
WHERE ([ec1].[Id] > 1) AND (@_outer_Id1 = [ec1].[LeftId]))
THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT)
END',N'@_outer_Id1 int',@_outer_Id1=2
go
exec sp_reset_connection
go
exec sp_executesql N'SELECT CASE
WHEN EXISTS (
SELECT 1
FROM [Rights] AS [ec1]
WHERE ([ec1].[Id] > 1) AND (@_outer_Id1 = [ec1].[LeftId]))
THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT)
END',N'@_outer_Id1 int',@_outer_Id1=3
go
exec sp_reset_connection
go
exec sp_executesql N'SELECT CASE
WHEN EXISTS (
SELECT 1
FROM [Rights] AS [ec1]
WHERE ([ec1].[Id] > 1) AND (@_outer_Id1 = [ec1].[LeftId]))
THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT)
END',N'@_outer_Id1 int',@_outer_Id1=4
go
exec sp_reset_connection
go
exec sp_executesql N'SELECT CASE
WHEN EXISTS (
SELECT 1
FROM [Rights] AS [ec1]
WHERE ([ec1].[Id] > 1) AND (@_outer_Id1 = [ec1].[LeftId]))
THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT)
END',N'@_outer_Id1 int',@_outer_Id1=5
go
回答子问题:
随着.NET Core 2.0的新发布,这个问题是否已经得到解决了?
不幸的是,Entity Framework在V2.x版本中仍然不能正确处理类型转换。
例如,使用Cast方法的这个LINQ查询无法正常工作:
var ids = ctx.MyTables
.Cast<IMyTable>()
.Cast<MyTable>()
.Where(x => x.SomeKey.Equals(keyId))
.Select(x => x.MyFieldIntegerIWant)
.ToList();
编辑:更新状态#1
不幸的是,EF Core团队仍未解决关于投影的N+1查询问题。
根据对v3.0最新状态的了解,我认为他们也没有计划很快修复这种问题:https://github.com/aspnet/EntityFrameworkCore/issues/10001#issuecomment-456581915
编辑:更新状态#2
现在,IncludeFilter
功能已经在EF Plus的最新版本(EF Core 2.x和EFCore 3.x)中得到支持。