【问题标题】:How can I select which properties to load and access them Locally如何选择要加载的属性并在本地访问它们
【发布时间】:2015-04-15 12:48:55
【问题描述】:

我有一个 Reservation 实体,它有一个名为 Occupations 的集合实体,该集合实体包含保留的所有占用,我想将 Reservation 实体绑定到 DevExpress GridControl 但我不想加载 Occupations 导航属性,我删除了虚拟但它仍然加载并显示在网格中,这是通过使用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;
}

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

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    我对 GridControl 不太熟悉,但是您是否尝试过在您的 Occupations 属性上添加 [Browsable(false)] 属性?

    【讨论】:

    • 是的,它有效,但这不是我想要做的,我希望能够选择在我的Local 内存实体中具有哪些属性。
    【解决方案2】:

    为什么还要在本地加载? 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)。

    【讨论】:

    • 不能绑定是什么意思?你试过AsEnumerable()而不是ToList()吗?
    • 但是这会返回一个 IQueryable 并且我无法绑定到它,当我添加 ToList() 时,我得到一个异常,说我无法在 LINQ 到实体查询中构造一个 Reservation。跨度>
    • 与 AsEnumerable 相同的异常。我的意思是我不能将它分配给数据源。
    • 嗯。看起来该控件出于某种原因需要IList - 您可以在不调用Load() 的情况下使用ToList,还是它仍然填充导航属性? (基本上在我的答案中添加ToList
    • 它会起作用,但我无法选择要加载的属性...它会加载所有内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    • 2021-11-13
    • 1970-01-01
    相关资源
    最近更新 更多