好吧这看起来非常简单,但出于某种原因,我没有运气。我有一个对象,我们称之为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
处理此问题的最佳方法是什么?
答案 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();