2009-09-01 7 views
1

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

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

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: Left Outer Join и Left Inner Join.

Таким образом, используя левое внешнее соединение можно написать следующий запрос (для упрощения я буду иллюстрировать вопрос, используя выражение 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 будет содержать все соответствующие Заказы.

Я просто не понимаю, как я могу использовать левое внутреннее соединение, чтобы получить тот же результат с фильтрацией на основе полей таблицы заказов (например, мне нужно запросить всех клиентов, у которых есть заказ с более высокой ценой чем 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 = ??? 
      }; 

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

+0

То, что вы называете «левое внешнее объединение» на самом деле называется «объединение группы» в Linq. Linq не является SQL, а понятия SQL не переводятся непосредственно в Linq. –

+0

Благодарим вас за исправление. – junglit

ответ

2

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

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 
      } 
+0

Большое спасибо за помощь! Пример «группа» - это то, что мне нужно. – junglit