2016-11-30 1 views
0

Ich weiß, dass es viele Fragen hier im Stapelüberlauf gibt, die das gleiche Thema haben, das ich fast alle lese, aber sie machten mich mehr verwirrt darüber.C# Wie ändert man das geladene dbSet mit der Methode Include abhängig von der Anfrage?

Bitte werfen Sie einen Blick auf den Code unten

if (request.PlaceType == PlaceType.Doctor) 
{ 
     var place = db.Doctors.Include(d => d.Reservations).FirstOrDefault(d => d.Id == request.PlaceId); 
     place?.Reservations.Add(request.ToReservation(userId)); 
} 
else if (request.PlaceType == PlaceType.Hospital) 
{ 
     var place = db.Hospitals.Include(d => d.Reservations).FirstOrDefault(d => d.Id == request.PlaceId); 
     place?.Reservations.Add(request.ToReservation(userId)); 
} 

Haben Sie bemerkt, dass die einzige Änderung zwischen den zwei if-Anweisungen ist nur der dbSet?

Meine Frage ist: Gibt es eine Möglichkeit, das gleiche Ergebnis ohne zu verwenden, wenn überhaupt, habe ich 4 Orte Entitäten, die ich gerade gepostet 2. Was, wenn der Client gebeten, weitere Orte in der Zukunft hinzuzufügen.

Antwort

0

Ich bin sicher, Reflektion ist was du brauchst, aber ich kann meinen Code jetzt nicht testen, also bin ich mir nicht sicher, ob das, was ich geschrieben habe, definitiv funktionieren wird ... aber es sollte mindestens so etwas sein.

 PropertyInfo[] placeTypes; 
     placeTypes = typeof(PlaceType).GetProperties(BindingFlags.Public | 
                BindingFlags.Static); 
var requestedType = placeTypes.SingleOrDefault(x=> x == request.PlaceType); 

PropertyInfo context = typeof(dbContext).GetPropertie(requestedType.Name + "s"); 

var place = context.Include(d => d.Reservations).FirstOrDefault(d => d.Id == request.PlaceId); 
     place?.Reservations.Add(request.ToReservation(userId)); 
+0

Ja, ich denke Reflektion ist was ich brauche, aber Ihr Code funktioniert nicht, Könnten Sie bitte versuchen, es zu aktualisieren, wenn Sie Zeit haben, thx für Ihre Hilfe –

1

Das macht mich fragen, ob Sie nicht viel besser dran mit nur einem Tisch und eine Einheit für Place sein würde, statt sie über mehrere Tabellen verbreitet, die offenbar in der Zahl wachsen kann ...


Noch könnte eine Lösung das sein. EF Entitätstypen sind immer Teilklassen, so können Sie es hinzufügen und eine Schnittstelle machen erben IPlace die wie folgt aussieht (fill in die Platzhalter):

interface IPlace 
{ 
    <<IdType>> Id { get; set; } 
    <<ReservationType>> Reservations { get; set; } 
    // perhaps more properties 
} 

dann den Code wie folgt verkürzen:

DbSet<IPlace> dbSet = null; 
if (request.PlaceType == PlaceType.Doctor) 
    dbSet = db.Doctors; 
else if (request.PlaceType == PlaceType.Hospital) 
    dbSet = db.Hospitals; 

if (dbSet == null) throw new Exception("Unsupported PlaceType"); 

var place = dbSet.Include(d => d.Reservations).FirstOrDefault(d => d.Id == request.PlaceId); 
place?.Reservations.Add(request.ToReservation(userId)); 
+0

Zuweisung 'DbSet dbSet = db.Doctors' wird nicht kompilieren weil ' Doktoren sind vom Typ 'DbSet ' und 'DbSet' ist nicht kovariant auf seinem generischen Typargument. –

Verwandte Themen