2016-11-30 61 views
0

我知道在堆棧溢出中存在很多問題,它們具有相同的主題,我幾乎閱讀了所有這些主題,但他們讓我更加困惑。C#如何更改加載的dbSet,使用Include方法取決於請求?

請大家看看下面

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)); 
} 

代碼你有沒有注意到的是,如果2語句之間唯一的變化只是dbSet?

我的問題是:有沒有辦法實現相同的結果而不使用,如果有的話,我有4個地方的實體,我剛剛發佈2.什麼如果客戶要求在未來增加更多的地方。

回答

0

我肯定反射是你需要的,但我現在無法測試我的代碼,所以我不確定我寫的東西肯定會起作用..但它至少應該是這樣的。

 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

是的,我認爲反思是我需要的,但你的代碼不工作,請你有空時更新它,請幫助 –

1

這使我不知道你會不會代替了,顯然可能增多多個表蔓延他們只用一個表和Place一個實體好得多,...


但是,解決方案可能是這樣的。 EF實體類型總是分部類,這樣你就可以添加到它,讓他們繼承,看起來像這樣的接口IPlace(在佔位符填寫):

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

然後縮短這樣的代碼:

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

作業'DbSet dbSet = db.Doctors'不會編譯,因爲'醫生'的類型是'DbSet ','DbSet'不是泛型類型參數的協變。 –

相關問題