实体框架3 - 链接导航属性中的过滤元素

时间:2012-05-09 16:14:31

标签: c# linq entity-framework

我正在尝试限制在一系列导航链中选择的元素。这是大致的顺序: 订单 - >偏好 - > PreferenceCard - >项目 - > OrderItem的

注意:

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

我认为与这些类型的问题混淆的主要原因是理解来自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
              ...
             };