вложенные запросы linq, как получить разные значения? - PullRequest
5 голосов
/ 09 ноября 2008

данные таблицы из 2 столбцов «категория» и «подкатегория»

я хочу получить коллекцию "category", [subcategories] используя код ниже, я получаю дубликаты. Puting .Distinct () после внешнего "from" мало помогает. Что мне не хватает?

 var rootcategories = (from p in sr.products
                                 orderby p.category
                                  select new
                                  {
                                      category = p.category,
                                      subcategories = (
                                      from p2 in sr.products
                                      where p2.category == p.category
                                      select  p2.subcategory).Distinct()
                                  }).Distinct();

sr.products выглядит так

category   subcategory
----------------------
cat1       subcat1
cat1       subcat2
cat2       subcat3
cat2       subcat3

что я получаю в результате

cat1, [subcat1,subcat2]
cat1, [subcat1,subcat2]

но я хочу только одну запись

решил мою проблему с помощью этого кода:

   var rootcategories2 = (from p in sr.products
                               group p.subcategory by p.category into subcats

                               select subcats);

теперь, может быть, пришло время подумать о том, что было правильным вопросом .. (-:

Ответы [ 4 ]

5 голосов
/ 09 ноября 2008

решено с этим кодом

   var rootcategories2 = (from p in sr.products
                               group p.subcategory by p.category into subcats

                               select subcats);

спасибо всем

3 голосов
/ 09 ноября 2008

Я думаю, вам нужно 2 вызова "Distinct ()", один для основных категорий, а другой для подкатегорий.

Это должно работать для вас:

var mainCategories = (from p in products select p.category).Distinct();

var rootCategories =
    from c in mainCategories
    select new {
        category = c,
        subcategories = (from p in products
                         where p.category == c
                         select p.subcategory).Distinct()
    };
2 голосов
/ 09 ноября 2008

Алгоритм, стоящий за Distinct (), нуждается в способе определить, равны ли 2 объекта в исходном IEnumerable. Метод по умолчанию для этого состоит в том, чтобы сравнить 2 объекта по их ссылке, и, следовательно, вероятно, что никакие 2 объекта не являются «равными», поскольку вы создаете их с ключевым словом «new».

Что вам нужно сделать, это написать собственный класс, который реализует IEnumerable, и передать его в вызов Distinct ().

1 голос
/ 09 ноября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...