【问题标题】:Entity Framework 3 - Filter Elements in Chained Navigational PropertiesEntity Framework 3 - 链式导航属性中的过滤器元素
【发布时间】:2012-05-09 16:14:31
【问题描述】:

我正在尝试限制在一系列导航链中选择的元素。大致顺序如下: Order -> Preference(s) -> PreferenceCard -> Item(s) -> OrderItem

注意事项:

  • 一个订单可以有多个偏好。
  • 首选项有 1 张首选项卡。
  • 偏好卡由项目组成。
  • OrderItem 包含有关该订单特定项目的详细信息。

如何将 OrderItems 的选择限制为仅与我的订单相关联的那些?我的 Include("Preference.PreferenceCard.Item.OrderItem") 只是抓取所有 OrderItems,即使它们与 Order 不对应。

我尝试了Where() 子句,但它似乎没有做任何事情:

.Where(
    o => o.Preference.Any(
        p => p.PreferenceCard.Items.Any(
            item => item.OrderItem.Any(
                orderItem => orderItem.OrderId == o.OrderId))))

如何通过 OrderId 正确过滤 OrderItems,甚至通过导航属性链接?

【问题讨论】:

    标签: c# linq entity-framework


    【解决方案1】:

    我认为对这些类型的问题造成混淆的主要来源是理解 EntityFramework 中的实体与普通类不同。如果您不想操纵您的数据结构或其导航属性(添加、修改、删除),并且您只想拥有数据的自定义视图,那么您应该返回匿名类型或 POCO(普通旧 CLR 对象) )。您可以声明自己的类并相应地分配属性。

    public class OrderView
    {
      public int Id { get; set; }
      public IEnumerable<OrderItem> OrderItems { get; set; }
      ...
    }
    
    var query = from o in context.Orders
                select new OrderView
                {
                  Id = o.Id,
                  OrderItems = //custom filtering
                  ...
                 };
    

    【讨论】:

    • 这个数据会被操作,出于性能原因我不想过滤内存中的对象。有没有办法过滤抓取的元素?
    • @strongriley - 我不建议您过滤内存中的元素。使用 EntityFramework,过滤您的 Entities 导航属性与删除这些项目相同。如果实体只有一小部分导航属性,你将如何操作数据?
    • 感谢您的指导 - 我最终直接从 Order 中获取了 OrderItems,然后进行迭代,将它们重新附加到 PreferenceCard/Items。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    • 2013-01-14
    相关资源
    最近更新 更多