[英]C# How to change the loaded dbSet, with Include method depending on the request?
我知道堆棧溢出中有很多問題與我幾乎都讀過的主題相同,但它們使我對此感到更加困惑。
請看下面的代碼
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個if語句之間的唯一變化只是dbSet?
我的問題是:是否有一種方法可以完全不使用if來實現相同的結果,我有4個place實體,我剛發布了2個。如果客戶要求將來添加更多places,該怎么辦?
這讓我想知道是否只用一個表和一個實體來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));
我敢肯定,反射是您所需要的,但是我現在無法測試我的代碼,因此我不確定我寫的內容是否肯定可以工作..但至少應該是這樣的。
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));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.