2012-03-16 6 views
0

Хорошо, это кажется безумно простым, но по какой-то причине мне не повезло. У меня есть объект, который позволяет называть его Заказ, и у него есть дети 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

Вы можете использовать DataLoadOptions.AssociateWith Method

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

это выглядит хорошо, но мне нужно, чтобы извлечь заказ принять некоторые решения о Что на порядке затем отфильтруйте результаты. Так что либо я загружаю заказ дважды, первый раз со всем, второй раз с фильтрованными деталями, либо нахожу другой метод. – ethermal

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, а ключевым свойством группы будет заказ.

версия «цепной метод» может быть немного красивее (и выходит из «избранных»):

var ordersWithBackOrders = db.OrderLines 
    .Where(ol => ol.BackOrder && ol.Order.Id == 9999) 
    .GroupBy(ol => ol.Order) 
    .FirstOrDefault(); 
Смежные вопросы