2017-04-18 9 views
2

Ich versuche, eine Liste der Objekte, die eine Liste der untergeordneten Objekte sowie aus der Datenbank haben.Entity Framework Core Include mit Filter

Hier ist ein Beispiel

public class User 
{ 
    public int Id { get; set; } 
    public ICollection<Child> Childs { get; set; } 
} 

public class Child 
{ 
    public int Id { get; set; } 
    public string UserId { get; set; } 
    public User User { get; set; } 
} 

Das Problem hier ist, dass ich nicht einen Weg finden kann eine Liste der Benutzer zu bringen und die Childs mit einem Zustand, wie auch zugleich zu filtern.

Ich habe versucht, so etwas wie diese:

users = _context.Users.Where(e => e.Childs.Any(ec => ec.Id > 1)) 

Aber mit diesem Beispiel, wenn die Bedingung nicht erfüllt ist, wird es nicht den Benutzer bringen und ich möchte alle Benutzer selbst wenn sie Childs nicht oder die Bedingung wird nicht erfüllt.

Auch dieses Projekt gefunden: https://github.com/zzzprojects/EntityFramework-Plus aber es sieht aus wie es nicht unterstützt EF Core für das, was ich tun möchte.

Hat jemand einen Vorschlag?

Dank

+0

Gefiltert umfassen - In allen EF-Versionen einschließlich Core nicht unterstützt. Kontinuierlich gestellte Frage zu SO. –

+0

@IvanStoev Danke für Ihren Kommentar, aber das beantwortet meine Frage nicht. Kennst du eine Alternative? – legollas007

+1

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. –

Antwort

4

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(); 
+0

Mit der neuen Version von .NET Core 2.0 wurde dieses Problem behoben? – legollas007

+1

Siehe den Kommentar, den ich hinzugefügt habe, kurz gesagt, nein ... 2.0 haben immer noch das gleiche Problem –

+0

wenn/wenn sie das Problem beheben, _ ** bitte ** _ kommen zurück und aktualisieren Sie diese Antwort! –