2016-11-30 58 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'不是泛型类型参数的协变。 –

相关问题