2009-11-09 2 views
0

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

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

не

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

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

Что я делаю неправильно?

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 запись для каждого Форд Мондео, это был мой тест, чтобы убедиться, что он работал, но мне нужно, чтобы расширить это, опять же он должен только вернуть 1 запись каждый для Ford Mondeo, как я проверил все они имеют одинаковое количество дверей, Categor, модель ид и т.д ..

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 ... я попытался отделить gr oup by и добавление запятой для других полей.

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

Любые идеи?

ответ

4

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

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

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

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

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

EDIT: Для группы более чем на одном поле, использовать анонимный тип:

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

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

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

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

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

+0

Благодаря Джон, большая помощь! .Это отлично работает, оно возвращает 1 запись для всех ford mondeos, я не совсем понимаю ключ, но могу ли я группировать свое поле в Linq, как в sql? Тогда что происходит с ключом? Я обновлю свой вопрос, чтобы показать вам, что я делаю –

+0

Вопрос обновлен –

+0

Я действительно получил это, но это лучший способ сделать это? выбор в пределах выбора CategoryId = g1.Выберите (x => x.CategoryId). Должен признаться, что это сработало ... ТАК Я вынужден вызвать метод select, чтобы получить поле с группировкой? И конечно, если 1 mondeo как 5 dorrs и 1 имеет 4 двери, но с тем же описанием - мне понадобится 2 записи, так как технически они разные, поэтому мне кажется, что вы должны иметь возможность группироваться на более чем 1 поле, Я думаю, что я все еще застрял в мире sql :-) !!! –

0

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

+0

Спасибо, bpayne, да, немного ошибка с моей терминологией, спасибо за исправление –

1

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

from v in dc.Vehicles 
    group v by v.Description into g1 
select g1.Key; 
Смежные вопросы