Linq внутренняя группа объединения - PullRequest
1 голос
/ 01 сентября 2009

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

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

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 = ???
            };

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

1 Ответ

3 голосов
/ 01 сентября 2009

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

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
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...