Группировка внутреннего соединения Linq

Я пытаюсь создать дерево выражений динамически.

Предположим, что у меня есть два простых класса:

class CustomerType
{
   public int Id { get; set; }
   public string Name { get; set; }
   public OrderType[] Orders { get; set; }
}

class OrderType
{
   public int Id { get; set; }
   public DateTime Date { get; set; }
   public decimal Price { get; set; }
}

.. и соответствующие типы сущностей без каких-либо ассоциаций (поэтому мне нужно использовать пользовательское соединение).

Мне нужно заполнить список клиентов соответствующими заказами. Я знаю, что в Linq есть два типа соединений: левое внешнее соединение и левое внутреннее соединение.

Итак, используя левое внешнее соединение, я могу написать следующий запрос (для упрощения я проиллюстрирую вопрос, используя выражение Linq вместо пользовательского кода генератора ExpressionTree):

var query = from c in db.Customers
            join o in db.Orders on c.Id equals o.CustomerId into g
            select new AccountType() 
            {
              Id = c.Id,
              Name = c.Name,
              Orders = g
            };

Таким образом, свойство Orders объекта AccountType будет содержать все соответствующие Orders.

Я просто не понимаю, как я могу использовать левое внутреннее соединение, чтобы получить тот же результат с фильтрацией на основе полей таблицы заказов (например, мне нужно запросить всех клиентов, у которых есть заказ с ценой выше 100,00):

var query = from c in db.Customers
            join o in db.Orders on c.Id equals o.CustomerId 
            where o.Price > 100.00
            select new AccountType() 
            {
              Id = c.Id,
              Name = c.Name,
              Orders = ???
            };

Спасибо за помощь!


person junglit    schedule 01.09.2009    source источник
comment
То, что вы называете левым внешним соединением, на самом деле называется групповым соединением в Linq. Linq — это не SQL, и концепции SQL не переводятся непосредственно в Linq.   -  person Thomas Levesque    schedule 01.09.2009
comment
Спасибо за исправление.   -  person junglit    schedule 01.09.2009


Ответы (1)


Я бы сделал так:

var query = from c in db.Customers
            join o in db.Orders on c.Id equals o.CustomerId into g
            select new AccountType() 
            {
              Id = c.Id,
              Name = c.Name,
              Orders = g.Where(o => o.Price > 100.00)
            };

При внутреннем соединении вам нужно будет использовать предложение group by:

var query = from c in db.Customers
            join o in db.Orders on c.Id equals o.CustomerId 
            where o.Price > 100.00
            group o by c into g
            select new AccountType() 
            {
                Id = g.Key.Id,
                Name = g.Key.Name,
                Orders = g
            }
person Thomas Levesque    schedule 01.09.2009
comment
Большое спасибо за помощь! Группа на собственном примере - это то, что мне нужно. - person junglit; 01.09.2009