C#如何更改加载的dbSet,使用Include方法取决于请求?
问题描述:
我知道在堆栈溢出中存在很多问题,它们具有相同的主题,我几乎阅读了所有这些主题,但他们让我更加困惑。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.什么如果客户要求在未来增加更多的地方。
答
我肯定反射是你需要的,但我现在无法测试我的代码,所以我不确定我写的东西肯定会起作用..但它至少应该是这样的。
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));
答
这使我不知道你会不会代替了,显然可能增多多个表蔓延他们只用一个表和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
是的,我认为反思是我需要的,但你的代码不工作,请你有空时更新它,请帮助 –