2016-07-01 7 views
1

Ich habe diese Situation: Zum Beispiel, ich habe diese Klassen:Suche in allen Kindern, die von einem Elternteil erben mit EF/Linq

1)

public abstract class User 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

2)

public class Administrator: User 
{ 
    public string SpecificAdministratorAttribute { get; set;} 
} 

3)

public class OtrherClass: User 
{ 
    public string SpecificOtherClassAttribute { get; set; } 
} 

4)

Wie Sie sehen können, wird das Attribut "SpecificAdministratorAttribute" in zwei Klassen wiederholt.

Nun, ich brauche eine Linq-Abfrage machen für alle Benutzer zu suchen, die diese Bedingung erfüllen:

  • Name = "zzz"
  • SpecificAdministratorAttribute = "xxx"

Wie kann ich Suche nach allen BENUTZERN (Eltern), die diese Bedingungen erfüllen. Eine der Lösungen besteht darin, dieses Attribut in die Elternklasse zu verschieben und es in einigen Fällen leer zu lassen. Was könnte die beste Lösung für dieses Szenario sein?

Und wie, wenn ich ein Attribut habe, das nur in einer der untergeordneten Klassen vorhanden ist, aber ich muss es von BENUTZER (Parent) suchen, ohne zu wissen, was von der Klasse der Kinder ist? Angenommen, Sie müssen alle Benutzer erreichen, die SpecificOtherClassAttribute = "uuu" erfüllen? Es gibt eine Möglichkeit, dies von USERS nicht von OTHERCLASS (Kinder) zu suchen? (Ich brauche ein Beispiel unter Verwendung von Linq)

Antwort

2
public class Admin: User 
{ 
    public string AdminAttribute { get; set; } 
} 

public class AdministratorTypeA: Admin 
{ 

} 

public class AdministratorTypeB: Admin 
{ 

} 

Abfrage wie folgt aus:

users.Where(u=> u is Admin && u.Name= "zzz" && (u as Admin).AdminAttribute=="xxx"); 
+0

Danke, aber wie, wenn ich ein Attribut, das nur in einer der untergeordneten Klassen ist, aber ich brauche um es von BENUTZERN (Eltern) zu suchen, ohne zu wissen, was von der Klasse der Kinder ist? Angenommen, Sie müssen alle Benutzer erreichen, die SpecificOtherClassAttribute = "uuu" erfüllen? Es gibt eine Möglichkeit, dies von USERS nicht von OTHERCLASS (Kinder) zu suchen? (Ich brauche ein Beispiel mit Linq) –

+0

Bearbeitet mit einem Beispiel. – Tom

0

Es gibt mehrere Ansätze, dieses Problem zu lösen.

Einer ist, wie Walter erwähnt, eine Basisklasse für Admin zu erstellen und von ihr zu erben. Dann können Sie überprüfen, ob der Benutzer ein Administrator ist und, wenn ja, ein entsprechendes Attribut erhalten.

Die andere ist eine Schnittstelle hinzuzufügen, so dass Sie nicht alle Ihre Klassen ändern müssen (nur für jeden von ihnen Vererbung von der Schnittstelle hinzugefügt werden):

public interface IAdministrator 
{ 
    string SpecificAdministratorAttribute { get; set;} 
} 

public class OtherKindOfAdministrator: User, IAdministrator 

Und dann können Sie die Suche mit LINQ prüft, ob Ihr Objekt IAdministrator ist.

Diese beiden Ansätze haben das gleiche Problem: Ausführungszeit. Das Problem ist, dass die Datenbank keine Dinge wie is Administrator oder is IAdministrator erstellen kann. So werden Sie alle Benutzer abrufen und werden sie dann individuell auf den benötigten Typ umwandeln, um zu sehen, ob sie dem entsprechen oder nicht.

Die Lösung hierfür wäre eine Eigenschaft der User Klasse UserType genannt hinzuzufügen (oder IsAdmin bool Eigenschaft, wenn Sie nur Admins und nicht admins hier haben), so können Sie leicht feststellen, wer ein Administrator ist und wer nicht.So dann werden Sie in der Lage sein, nur retreive aus der Datenbank-Administratoren und extrahieren Sie diese benötigen Sie:

users.Where(u => u.UserType == UserTypes.Admin).Select(u => u as Administrator).Where(u => u.Name == ”zzz” && u.AdminAttribute == ”xxx”); 
+0

Danke Ivan für dich antwort, aber mein Problem ist, dass ich nicht weiß, welche Art von Kindern zu suchen. Ich muss alle BENUTZER (im Allgemeinen) mit einem spezifischen Attribut suchen. Dieses Attribut gehört nicht zu den BENUTZERN, es gehört zu einer der Klassen der Kinder. (Vielleicht hat eines der Kinder dieses Attribut nicht, also bringen Sie nur diejenigen mit, die dieses Attribut haben, und wenn ja, diejenigen, die dem Attribut entsprechen, geben nur die gemeinsamen Daten zurück (USERS) -). –

Verwandte Themen