Выберите первые строки из таблицы данных с помощью LINQ

У меня есть данные, подобные следующему

A  |  B
-------
1  |  b1
1  |  b2
1  |  b3
2  |  b4
2  |  b5
3  |  b6
3  |  b7
3  |  b8
3  |  b9

Как я могу написать команду LINQ для выбора первой строки для каждого отдельного значения в столбце A:

A  |  B
---------
1  |  b1
2  |  b4
3  |  b6

person Dylan    schedule 05.09.2012    source источник


Ответы (3)


Вам нужно сгруппировать по столбцу A, а затем выбрать первую запись B. (Возможно, вы захотите отсортировать значения столбца B)

Здесь есть пример кода:

Получить отдельные записи, используя linq to entity

person konqi    schedule 05.09.2012

var result = list.GroupBy(x => x.A).Select(x => x.First()).ToList();

или используйте DistinctBy из MoreLINQ.

var result = list.DistinctBy(x => x.A).ToList();
person Zen    schedule 05.09.2012
comment
что это за список перед GroupBy? - person Dylan; 05.09.2012
comment
@Siyavash «список» — это набор объектов, содержащих поле A. В данном контексте это набор строк таблицы с полями A и B. - person Zen; 05.09.2012
comment
о, я понимаю, но я думаю, вам нужно четко указать это, когда вы пишете свой код в качестве ответа. это может вызвать непонимание. - person Dylan; 06.09.2012

IEnumerable<DataRow> aRows = table.AsEnumerable()
                                  .GroupBy(r => r.Field<int>("A"))
                                  .Select(g => g.First());

Если вы хотите, чтобы он был упорядочен по полю B (если он не упорядочен им изначально):

IEnumerable<DataRow> aRows = table.AsEnumerable()
                                  .OrderBy(r => r.Field<String>("B"))
                                  .GroupBy(r => r.Field<int>("A"))
                                  .Select(g => g.First());

Если вам нужна другая таблица из него:

DataTable tblARows = aRows.CopyToDataTable();
person Tim Schmelter    schedule 05.09.2012
comment
Как добавить в это предложение where? - person Jogi; 16.05.2016