实体框架 - 包含导航属性的选择条件

cto*_*orx 6 c# linq entity-framework navigation-properties

假设我有这些简化的EF生成实体......

public class PurchaseOrder
{
     public int POID {get;set;}
     public int OrderID {get;set;}
     public int VendorID {get;set;}
     public IEnumerable<Order> Orders {get;set;}
}

public class Order
{
     public int OrderID {get;set;}
     public decimal Price {get;set;}
     public IEnumerable<Item> Items {get;set;}
}

public class Item
{
     public int OrderID {get; set;}
     public string SKU {get;set;}
     public int VendorID {get;set;}
     public Order Order {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

商业逻辑:

订单可以有多个PO,一个用于订单上的每个不同供应商(供应商在物料级别确定).

我如何选择性地包括儿童实体?

查询PO时,我想自动为订单和项目添加子项目.

我完成了这个,使用Include()...

Context.PurchaseOrders.Include("Orders.Items");
Run Code Online (Sandbox Code Playgroud)

这是它的工作并拉回相关实体,但是,我只想包含其VendorID与PurchaseOrder实体的VendorID匹配的Item实体.

对于传统的SQL,我只是在JOIN条件中包含它,但EF在内部构建它们.

我可以使用什么LINQ魔术告诉EF应用条件,而无需在实体之间手动创建JOIN?

Ada*_*kis 4

您无法有选择地撤回符合特定条件的某些子实体。您能做的最好的事情就是自己手动过滤掉相关订单。

public class PurchaseOrder
{
     public int POID {get;set;}
     public int OrderID {get;set;}
     public int VendorID {get;set;}
     public IEnumerable<Order> Orders {get;set;}

     public IEnumerable<Order> MatchingOrders {
         get {
            return this.Orders.Where(o => o.VendorId == this.VendorId);
         }
     }
}
Run Code Online (Sandbox Code Playgroud)