我有一个Reservation实体,它有一个名为Occupations的集合实体,它拥有预留的所有占用,我想将Reservation实体绑定到DevExpress GridControl,但我不想加载Occupations导航属性,I删除虚拟但它仍然加载并显示在网格中,这是使用Load()
,我试过的
public IEnumerable<Reservation> GetCurrentReservations()
{
var DateNow = DateTime.Now.Date;
context.Reservations
.Where(r => r.ArrivalDate >= DateNow)
.Select(r => new
{
r.ReservationId,
r.DepartureDate,
...//Other properties
})
.Load();
return context.Reservations.Local;
}
但是没有任何东西在本地加载,可能是因为我正在创建一个匿名类型的列表,所以我该怎么办?
答案 0 :(得分:2)
我对GridControl不太熟悉,但您是否尝试在Occupations属性中添加[Browsable(false)]属性?
答案 1 :(得分:1)
为什么要在本地加载? Load
通常用于加载实体,但不能立即加载实体。由于您立即绑定它们,为什么不绑定到查询:
return context.Reservations
.Where(r => r.ArrivalDate >= DateNow);
更新
您使用的控件似乎需要IList
而不仅仅是普通IEnumerable
(可能是出于寻呼/导航的原因)。在这种情况下,可以尝试以下几种方法:
return context.Reservations
.Where(r => r.ArrivalDate >= DateNow)
.ToList();
如果你想挑选要加载的列,你可能需要投射到匿名类型,切换到Linq-to-Objects,并在内存中创建新的Reservation
对象。
return
context.Reservations
.Where(r => r.ArrivalDate >= DateNow)
.Select(r => new
{
r.ReservationId,
r.DepartureDate,
...//Other properties
})
.AsEnumerable()
.Select(r => new Reservation
{
ReservationId = r.ReservationId,
DepartureDate = r.DepartureDate,
...//Other properties
})
.ToList();
请注意,新对象将与上下文断开连接,因此您无法从中更新数据库;您需要在上下文中创建Reservation
个对象,更新属性并将其保存回来。
如果您正在使用MVC或MVVM模式,您可以考虑添加ViewModel
作为实体层的抽象层(它应该非常接近地模仿我们的数据库)。缺点是您加载的数据超出实际需要的数量,并且您必须添加映射投影(或使用类似AutoMapper的库),但它可以让您更好地控制实际加载到视图中的内容(这是目标的一部分) MVC)。