簡體   English   中英

C#如何根據請求使用Include方法更改加載的dbSet?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM