2015-06-22 8 views
3

Имея проблемы с получением данных из Northwind с помощью Linq-на-SQL из 3-х таблиц:Группировка без дублирования поставщиков строки

  1. Suppliers
  2. Products
  3. Categories

Я хотел бы принести поставщики всех продуктов, которые относятся к категории с categoryId > 3. Для набора результатов потребуется 1 строка для каждого поставщика, а затем некоторый набор дочерних элементов, содержащий строку для каждого продукта, включая информацию о категории. Идея заключается в том, что этот результат будет возвращен как json-значение из вызова ajax.

Ниже простейший вариант моих усилий до сих пор:

from sups in Suppliers 
join prods in Products on sups.SupplierID equals prods.SupplierID 
join cats in Categories on prods.CategoryID equals cats.CategoryID 
where (cats.CategoryID > 3) 

group sups by sups.SupplierID into g 
select g 

В LINQPad это выглядит как ResultSet содержит много дублирующих поставщиков. Любые мысли?

РЕДАКЦИЯ: Благодаря ответу Adduci, я в конечном итоге со следующим утверждением рабочего LINQ:

from sups in Suppliers 
join prods in Products on sups.SupplierID equals prods.SupplierID 
join cats in Categories on prods.CategoryID equals cats.CategoryID 
where cats.CategoryID > 3 
group new { sups, prods, cats } by new { sups.SupplierID, sups.CompanyName } into g 
select new 
{ 
    g.Key, 
    ProductInfo = from x in g 
       select new 
       { 
        ProductProperty = x.prods.ProductName, 
        CategoryProperty = x.cats.CategoryName 
       } 
} 

Дополнительным by new { sups.SupplierID, sups.CompanyName } завершает набор результатов, включая полей поставщик. Ницца!

ответ

2

Первый шаг группировать 3 таблицы вместе, используя анонимный класс

group new { sups, prods, cats } 

Вместо select g, который является (IGrouping<...>) вы должны явно определить Вы хотите, чтобы это:

from sups in Suppliers 
join prods in Products on sups.SupplierID equals prods.SupplierID 
join cats in Categories on prods.CategoryID equals cats.CategoryID 
where cats.CategoryID > 3 
group new { sups, prods, cats } by sups.SupplierID into g 
select new 
{ 
    Supplier = g.Key, 
    ProductInfo = from x in g 
       select new 
       { 
        ProductProperty = x.prods.Prop1, 
        CategoryProperty = x.cats.Prop1 
       } 
} 

Таким образом, вы предотвратите возвращение неиспользуемой информации из базы данных

+0

Я вижу, что вы исправили опечатка g.prods к x.prods. Большое спасибо!! Прекрасно работает! – Paul0515

+0

Я только что понял, есть еще одна проблема: главная информация о поставщике содержит только значение ключа, а productinfo ... может быть расширено с другими свойствами поставщика (ex CompanyName?) – Paul0515

+0

@ Paul0515 - Да. Вы можете добавить 'CompanyName = g.FirstOrDefault(). Sups.CompanyName'или ваш способ может быть даже лучше – Aducci

1

Это часто бывает при соединении столов. Обычно вы можете исправить это, используя Distinct().

Что-то вроде этого:

(from sups in Suppliers 
join prods in Products on sups.SupplierID equals prods.SupplierID 
join cats in Categories on prods.CategoryID equals cats.CategoryID 
where (cats.CategoryID > 3) 
group sups by sups.SupplierID into g 
select g).Distinct() 
+0

спасибо за ваше предложение, одна из проблем заключалась в получении свойств продукта и категории в той же строке ... – Paul0515

Смежные вопросы