Haftungsausschluss: Ich bin der Besitzer des Projekts Entity Framework Plus
Unsere Bibliothek nicht Abfragefilter noch für .NET-Core aufgrund der N + 1-Abfragen Ausgabe unterstützen.
Unter unserer Haube für EF6 machte unsere Bibliothek nur eine einfache Projektion.
Etwas ähnlich wie diese mit Ihrer Information:
var users = _Context.Users.Select(x => new {
Users = x,
Childs = x.Childs.Any(ec => ec.Id > 1)
})
.ToList()
.Select(x => x.Users)
.ToList();
jedoch für EF-Core, die gleiche Projektion einer Datenbank gehört: machen Kind zu bekommen für jeden Benutzer (N + 1 Abfrage)
können Sie versuchen Sie die folgende Projektion und sehen Sie, ob Sie den gleichen Fehler erhalten.
Ich glaube, bis das EF Core-Team es beheben, gibt es meines Wissens keinen Weg (von mir bewusst), Kind-Entitäten zu filtern.
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
ANTWORT Sub-Frage:
Mit der neuen Version von .NET Core 2.0 unterstützt wurde dieses Problem behoben?
Leider ist Entity Framework noch nicht in der Lage Guss korrekt mit dem V2.x
von Beispiel zu handhaben, diese LINQ, die die Cast-Methode verwenden, funktioniert nicht:
var ids = ctx.MyTables
.Cast<IMyTable>()
.Cast<MyTable>()
.Where(x => x.SomeKey.Equals(keyId))
.Select(x => x.MyFieldIntegerIWant)
.ToList();
Gefiltert umfassen - In allen EF-Versionen einschließlich Core nicht unterstützt. Kontinuierlich gestellte Frage zu SO. –
@IvanStoev Danke für Ihren Kommentar, aber das beantwortet meine Frage nicht. Kennst du eine Alternative? – legollas007
Nur mit einigen expliziten Lade-/Navigationseigenschafts-Fix-Up-bezogenen Tricks, ähnlich wie * Sie können auch filtern, welche verbundenen Entitäten in den Speicher geladen werden.* Beispiel aus der [Dokumentation] (https://docs.microsoft.com/en-us/ef/core/querying/related-data). Es erfordert jedoch, dass die Abfrage materialisiert wird. –