在父对象上过滤子实体集

时间:2012-03-16 15:55:02

标签: c# linq

好吧这看起来非常简单,但出于某种原因,我没有运气。我有一个对象,我们称之为Order,它有子OrderLines。我在数据库中定义了外键关系,因此当我加载Order对象时,会加载Orderlines子项。我想要做的是稍后过滤孩子们。因此,在我根据某些逻辑加载Order对象之后,我想要过滤子项。例如,我知道在我加载订单对象后,我只想向您显示后退订单的行。

var order = (from o in db.Orders where o.Id=9999 select o).firstordefault(); 
//bunch of code and conditions validated, complex business logic
// I need to filter the OrderLines to back order lines only

想做类似的事情

order.OrderLines = order.OrderLines.Where(ol=>ol.BackOrder==true); //this won't work

处理此问题的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

您可以使用DataLoadOptions.AssociateWith Method

DataLoadOptions dlo = new DataLoadOptions();
dlo.AssociateWith<Customer>(c => c.Orders.Where(ol=>ol.BackOrder==true));   

答案 1 :(得分:0)

请勿修改数据库中的集合。尝试为您的延期交货者创建一个新变量。

var backorders = order.OrderLines.Where(ol => ol.BackOrder);

如果您想从数据库获取订单并且只提取延期交货,您可以这样做:

var ordersWithBackOrders =
    (from ol in db.OrderLines
     where ol.BackOrder && ol.Order.Id == 9999
     group ol by ol.Order
     into orderGroups
     select orderGroups).FirstOrDefault();

这会返回IGrouping<Order, OrderLine>。该组只有OrderLines,其中BackOrder == true,而该组的Key属性将是Order。

“方法链”版本可能更漂亮(并且省略了“选择”):

var ordersWithBackOrders = db.OrderLines
    .Where(ol => ol.BackOrder && ol.Order.Id == 9999)
    .GroupBy(ol => ol.Order)
    .FirstOrDefault();