Фильтрация Агрегировать корневую сущность и дочернюю сущность по свойству дочерней сущности - PullRequest
0 голосов
/ 17 мая 2011

Надеюсь, что кто-то может помочь с этим!

Я приведу пример, основанный на стандартном Order -> OrderLine -> Product, а не на реальной ситуации, чтобы было легче объяснить!

По сути, я хочу выполнить запрос, который возвращает все заказы, для которых есть строка заказа, содержащая телевизор.Достаточно просто:

IEnumerable<Order> orders;
          using (var context = new DataContext())
          {
              var source =
                  context.Orders.Include("OrderLines").Include(
                      "OrderLines.Product");

              orders= source.Where(o => o.OrderLines.Where(ol => ol.Product.Name == "TV")).ToList();
          }
          return orders;

Это работает в том смысле, что я получаю правильную коллекцию сущностей Order, но когда я использую взгляд на коллекцию OrderLines каждого Order, она содержит all OrderLines не толькоте, которые содержатся по телевизору.

Надеюсь, что это имеет смысл.

Заранее благодарим за любую помощь.

Ответы [ 2 ]

1 голос
/ 18 мая 2011

Главное знать, нужно ли вам (или нет) сохранять ссылку на заголовок заказа в отфильтрованных строках. То есть Вы хотите список всех заказов с телевизором, а точнее только их телевизионные линии? или вы хотите чтобы все телевизионные линии не обращали внимания на заголовок своего заказа?

Кажется, вы предпочитаете первый вариант. Тогда лучшим решением, безусловно, будет

var relevantOrders = orders.Where(order => order.OrderLines.Any(ol => ol.Product.Name == "TV"))

для получения соответствующих заказов, а затем, для каждого заказа в релевантных заказах:

order.OrderLines.Where(ol => ol.Product.Name == "TV")

для рассмотрения только телевизионных линий.

Другие методы могут привести к потере информации или вынудить вас создать новую коллекцию заказов, аналогичную первоначальной, но с двойной фильтрацией по заголовкам и строкам, что кажется довольно плохим с точки зрения элегантности и производительности. .

1 голос
/ 17 мая 2011

Я имею смысл в том, что запрос удовлетворяет вашим первоначальным критериям «вернуть все заказы, для которых есть строка заказа, содержащая телевизор», каждый заказ, конечно, будет иметь все строки заказа.Фильтр используется только для выбора ордеров, а не строк ордеров.

Чтобы извлечь только ордера, содержащие ТВ, из ордера, вы бы снова использовали фильтр, таким образом:

var OrderLinesWithTV = order.OrderLines.Where(ol => ol.Product.Name == "TV");
...