Выберите DISTINCT для столбца при выборе нескольких столбцов в Linq - PullRequest
1 голос
/ 05 октября 2011

Я выбираю несколько столбцов из таблицы (идентификатор, имя). Я хотел бы получить записи с другим именем. Мне интересно, как это сделать в LINQ.

Следующий код возвращает Dictionary<string,string>

return db.CourseTypes
    .Select(ct => new { ct.Id, ct.Name})
    .AsEnumerable()
    .ToDictionary(kvp => kvp.Id.ToString(), kvp => kvp.Name);
}

Как я могу получить обратно записи с разными значениями в столбце «Имя»?

1 Ответ

2 голосов
/ 05 октября 2011

Немного более простой подход, чем у StriplingWarrior (я думаю) и с немного меньшим количеством проблем:

return db.CourseTypes
         .GroupBy(ct => ct.Name, ct => ct.Id)
         .ToDictionary(group => group.First(), group => group.Key);

Обратите внимание, что это предполагает, что ваши идентификаторы также уникальны - если два разных имени имеюттот же идентификатор, ToDictionary потерпит неудачу.

Также обратите внимание, что если у вас есть несколько идентификаторов с одним и тем же именем, предполагается, что вам все равно, какой из них указан на карте.Если вы хотите убедиться, что это (скажем) самое раннее имя, которое вы могли бы сделать:

return db.CourseTypes
         .GroupBy(ct => ct.Name, ct => ct.Id)
         .ToDictionary(group => group.OrderBy(x => x).First(),
                       group => group.Key);

Теперь возможно, что это сделает переход Queryable to Enumerable в неправильную точку, поэтому вы могли бы want:

return db.CourseTypes
         .GroupBy(ct => ct.Name, ct => ct.Id)
         .Select(g => new { Name = g.OrderBy(x => x).First(), Id = g.Key })
         .ToDictionary(g => g.Name, g => g.Id);

С большей вероятностью все упорядочивание и т. Д. Внутри базы данных выполняется за один раз ... Я думаю ... хотя стоит проверить журналы.

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