如何选择要加载的属性并在本地访问它们

时间:2015-04-15 12:48:55

标签: c# entity-framework

我有一个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;
}

但是没有任何东西在本地加载,可能是因为我正在创建一个匿名类型的列表,所以我该怎么办?

2 个答案:

答案 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)。