Entity Framework - Erste Anzahl der Untergeordneten Datensätze aus einer Liste von Entitäten
Ich habe gekämpft, um meinen Kopf um diese für eine Weile, also dachte ich würde post hier oben.
War, wenn ich ein 1->Viele-Beziehung zwischen einem Übergeordneten Objekt und eine Kind-Objekt. Dann abgerufen, meine Übergeordnete Objekte aus meinem Kontext in ein List-Objekt. Ich iteriere durch die Liste setzen eines "virtuellen" - Eigenschaft auf jedes Kind nehmen. Die "virtuelle" Eigenschaft ist eine Aufzählung, definiert ist, definiert einen status, ie Neu, Unverändert Gültigkeit. Seine Implementierung als eine Eigenschaft, eine Abstrakte Klasse, die die Entitäten umzusetzen.
Sobald ich dies getan haben, möchte ich, um die Anzahl aller untergeordneten Objekte haben den status " sage "Neu".
Parent.Sum(p => p.Child.Where(c => c.Status == New).Count())
Das erste problem ist, dass dies geht zurück auf die Datenbank einmal für jeden übergeordneten Datensatz und ruft alle verknüpften untergeordneten Datensätze.
Zweite Problem ist, dass, weil das Feld Status ist nicht eine tatsächliche Datenbank-Feld, die Werte sind alle in den Aufzählungen Standardwert.
Jede Hilfe bei diesem würde sehr geschätzt werden.
EDIT:
Also, Erstens, ich nicht wollen, dass die Status-Spalte in der Datenbank. Ich kann wenn ich will, aber es nicht das, was ich will, zu bestehen.
Dies ist wahrscheinlich das beste Beispiel der vollständige code, den ich geben kann.
List<Parent> parents = myDB.Parents.ToList();
foreach(Parent parent in parents)
{
foreach(Child child in parent.Child)
{
if (condition1)
{
child.Status == Statuses.Status1;
}
else if (condition2)
{
child.Status == Statuses.Status2;
}
else if (condition3)
{
child.Status == Statuses.Status3;
}
}
}
Console.WriteLine(Parent.Sum(p => p.Child.Where(c => c.Status == New).Count()))
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden eager loading von Kind-Entitäten zu vermeiden, die mehrere Datenbank-Abfragen:
Auch wenn Sie nicht die Karte, die enum-Eigenschaft der Datenbank-Spalte (z.B. EF5 mit .NET 3.5), dann erstellen Sie integer-Eigenschaft, die gemappt werden, um Ihre Datenbank-Spalte und markieren Sie Ihre enum-Eigenschaft nicht zugeordnet:
Wenn Sie die Eigenschaft zugeordnet Spalte in der Datenbank, dann werden alle Berechnungen erfolgen auf der server-Seite:
Diese übersetzt werden in die Abfrage wie:
Etwas wie diese funktionieren könnten:
Dieser Ansatz löst dein erstes problem. Da die
.ToList()
schafft eineList<Parent>
in den Speicher und alle Abfragen auf, die es nicht durchführen jegliche Datenbank-Abfrage.Aber ich bin mir nicht sicher, ob das es löst auch dein zweites problem ist oder nicht. Der nächste EntityState Ihrem Bedarf ist
EntityState.Added
.Und in der Tat, es hängt von Ihrer Bedeutung ab
New
Zustand...Sollten wir schauen auch zu deaktivieren lazy loading. Dies führt in der Regel, dass die Navigations-Eigenschaften, um die Datenbank abzufragen. Einen schnellen Weg, um das Kind zählt in ein view-Modell wird in diesem Artikel gezeigt:
http://www.ozkary.com/2015/04/entity-framework-associated-table.html