3 Stimmen

Wie man Filter oder Bedingungen auf Navigations Eigenschaften in Entity Framework platziert

Ich habe eine Tabelle in meiner SQL-Datenbank namens 'Clients' und in dieser Tabelle gibt es ein Feld namens Status. Es kann 2 Werte enthalten, 'A' für aktiv oder 'I' für inaktiv. In meinem MVC-Webanwendungsframework mit Entity Framework v5 habe ich das Repository-Muster mit einem spezifischen ClientRepository implementiert.

Immer wenn ich einen Aufruf an das ClientRepository mache, gibt es einen vordefinierten Filter, der sicherstellt, dass alle Abfragen gefiltert werden und nur 'A' Statusdatensätze zurückgegeben werden... und alles ist gut.

Das Problem, vor dem ich jetzt stehe, ist, wenn ich LINQ verwende, um eine Tabelle abzufragen, die mit Clients verknüpft ist, z. B. ClientOrders, und dann auf die Navigationseigenschaft Clients zugreife. Wenn ich dies tue, werden alle Clients mit einem beliebigen 'Status', einschließlich 'I', abgerufen.

Weiß jemand, ob es eine Möglichkeit gibt, E.F. im Designer oder Kontext zu konfigurieren, um Bedingungen für Navigationseigenschaften festzulegen, die meinen Anforderungen genügen, sodass nur 'A'-Status zurückgegeben werden?

Beachten Sie, dass dies nur ein Beispiel für viele Fälle in meiner Anwendung ist, die 'Status' als Datensatzindikator verwenden, und dass ich mehrere Navigation

3voto

Manoj Punkte 604

Sie können dies mit einer LINQ-Abfrage erreichen. Hier ist ein Beispiel dafür:

var clientOrders = _context.ClientOrders    
    .Select(item => new {
        ClientOrders = item,
        Clients = item.Clients.Where(q => q.Status == "A")
    }).ToList();

Dies gibt eine Liste des neuen anonymen Typs zurück. Sie können die anonyme Struktur in ClientOrders umwandeln, nachdem Sie diese Abfrage ausgeführt haben.

0voto

Colin Punkte 21707

Es scheint, als ob du versuchst, eine sanfte Löschung zu implementieren. Dafür gibt es eine Lösung hier https://stackoverflow.com/a/18985828/150342

Aber das bedeutet, dass das Statusfeld nur mit SQL geändert werden kann....

Vielleicht könntest du Vererbung verwenden? Du hättest also AktiveKunden und InAktiveKunden und HyperAktiveKunden, die alle von einem abstrakten BasisKunde erben. Anstatt also den Status zu setzen, konvertierst du ihn einfach von einem Typ zum anderen.

BEARBEITEN Wenn ich darüber nachdenke, ist die Konvertierung nicht so einfach. Du kannst nicht einfach einen zum anderen umwandeln, du müsstest den AktivenKunden löschen und einen neuen InAktivenKunden erstellen und das könnte aufgrund von Fremdschlüssel-Einschränkungen usw. nicht trivial sein....

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X