Фильтрация информации о стране из географических данных по Linq - PullRequest
0 голосов
/ 23 октября 2019

В моей базе данных есть такая таблица:

Id       City       Country
==============================
1          A           X
2          B           X
3          C           X
4          D           X
5          M           Y
6          N           Y
7          O           Y
8          P           Y
9          U           Z
10         V           Z

Я хочу получить страны с первым (минимальным) Id из таблицы. Набор результатов должен выглядеть следующим образом:

Id       Country
=================
1           X
5           Y
9           Z

Я могу получить этот результат с помощью SQL как:

SELECT
    MIN(Id) AS Id,
    Country
FROM
    AllCityList
GROUP BY
    Country
ORDER BY
    Country ASC

Но когда я добавляю это представление в EntityFramework, так как MIN() скрывает столбец PrimaryKey (Id) Я получаю ошибку. Следовательно, я хочу преобразовать этот запрос в Linq. Как я могу написать этот запрос в Linq?

Ответы [ 2 ]

1 голос
/ 23 октября 2019

Вы можете использовать GroupBy с Min. Приведенный ниже запрос группирует данные на основе Страна и выбирает Min Id .

return AllCityList.GroupBy(d => d.Country).Select(d => 
                    {
                        var first = d.First();
                        return new { Id = d.Min(x => x.Id),  Country = first.Country};
                    });

Проверка этого dotnetfiddle, который демонстрируетсценарий.

Кроме того, при использовании Min он обязательно выберет минимальный Id в случае, если столбец не является кластеризованным индексом.

0 голосов
/ 23 октября 2019

Вы можете сделать следующее:

AllCityList
// might as well skip this step if the Id column is always sorted
.OrderBy(x => x.Id)
// the groups elements will maintain their sorting, so the first
// element of a group always has the lowest Id
.GroupBy(x => x.Country, (key, g) => g.First())
.Select(x => new {Id=x.Id,Country=x.Country});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...