LINQ: понимание и выполнение Groupby для возвращения уникальных строк? - PullRequest
0 голосов
/ 09 ноября 2009

Я пытаюсь сделать групповой в linq, в основном у меня есть список (вдоль списка - около 1000 записей), и я хочу, чтобы групповой Описание.

Записи являются транспортными средствами, следовательно, существует около 50 Ford Mondeos

Мой запрос довольно прост, никаких объединений (пока :-)), но он возвращает список, включающий 50 Ford Mondeos, я хотел сгруппировать их, чтобы была только 1 запись.

Я только выбираю Описание, я не выбираю идентификаторы, которые будут отличаться, но в LinqPad он возвращает desc, и я вижу 50 одинаковых форд мондео в описании - буква за буквой.

Что я делаю не так?

from v in dc.Vehicles
   group v by v.Description into g1
from y in g1
   orderby y.Description 
select new
{
     Desc = y.Description 
};

EDIT

Теперь он возвращает только 1 запись для каждого Ford Mondeo, это был мой тест, чтобы убедиться, что он работает, но мне нужно остановиться на этом, опять же, он должен вернуть только 1 запись для каждого Ford Mondeo, так как я проверил, все они имеют такое же количество дверей, категории, номер модели и т. д.

from v in dc.Vehicles
  group v by v.Description into g1
orderby g1.Key
  select new
  {
     Desc = g1.Key,
     CategoryId = g1.CategoryId,
     MakeId = g1.MakeId,
     ModelId = g1.ModelId,
     Doors = g1.Doors,
  };

Конечно, вышеприведенное не работает, оно не находит все остальные поля, то есть CategoryId ... Я попытался разделить группу и добавить запятую для других полей.

Я думаю, что у меня небольшая путаница с ключом, я понимаю, что это ключ, но если вы группируете по более чем 1 полям, то потенциально у вас будет более 1 ключа.

Есть идеи?

Ответы [ 3 ]

4 голосов
/ 09 ноября 2009

Вы используете второе «от», которое вызывает проблему. Попробуйте это:

from v in dc.Vehicles
group v by v.Description into g1
orderby g1.Key
select new
{
     Desc = g1.Key
};

Концептуально, подобная группа состоит из «последовательности последовательностей» - одной подпоследовательности на группу со всеми элементами, соответствующими этой группе. Каждая подпоследовательность имеет ключ - описание в данном случае.

Ваше предложение "from" в основном гласило: "Для каждой группы, дайте мне все элементы в группе" - фактически разгруппировав их снова :) Как правило, вы выполняете какую-то агрегацию в группе, например для финальной части:

select new
{
     Desc = g1.Key,
     Oldest = g1.Min(x => x.Date),
     Newest = g1.Max(x => x.Date)
};

РЕДАКТИРОВАТЬ: Чтобы сгруппировать по нескольким полям, используйте анонимный тип:

group v by new { v.Description, v.Doors, v.Model } into g1

Этот анонимный тип будет формировать ключ.

Чтобы получить любое поле в записи, вы можете попробовать:

выберите новый { RandomField = g1.First (). RandomField, Описание = g1.Key, // так далее }

Это логически занимает первую запись в подпоследовательности. Я не знаю, будет ли это работать для LINQ to SQL, хотя я знаю, что это будет работать в LINQ to Objects, но я не знаю, каким будет эквивалент SQL. Даже если он работает , он может быть невероятно дорогим. Я подозреваю, что группировка по составному ключу (по анонимному типу) - это то, что нужно.

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

Если вам просто нужны ключи (поля, по которым вы сгруппированы), вам нужно сделать что-то вроде этого ...

from v in dc.Vehicles
   group v by v.Description into g1
select g1.Key;
0 голосов
/ 09 ноября 2009

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

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