Использование [0] или First () с LINQ OrderBy - PullRequest
1 голос
/ 03 марта 2009

Если у меня есть такая структура

Альбомы
- Альбом
- Диски
- Треки

и я хочу заказать коллекцию альбомов по названию первого трека на первом диске.

Есть ли что-то похожее на следующее, что я мог бы сделать (помня, что мне нужно использовать метод расширения OrderBy, который принимает строку)?

albums.OrderBy("Discs[0].Tracks[0].Title")

Мне нужно иметь возможность сортировки с использованием строкового выражения, поэтому мне нужно использовать метод OrderBy, т.е. album.OrderBy ("Track [0] .Title"). Причина этого в том, что наша пользовательская среда использует выражение сортировки (например, «Заголовок»), переданное из GridView, которое ищется в словаре (например, «Track [0] .Title»), чтобы получить правильный порядок по выражению. То есть поле и направление сортировки определяются динамически во время выполнения.

или

albums.OrderBy("Discs.First().Tracks.First().Title")

Ответы [ 4 ]

3 голосов
/ 03 марта 2009

Не проверено, но как насчет:

    var query = from album in albums
                let disc = album.Discs.First()
                let track = disc.Tracks.First()
                orderby track.Title
                select album;
2 голосов
/ 26 октября 2011

У LINQ есть два способа запроса выражений "from. In .." и лямбда-выражений. То, как вы почти писали, выглядело как лямбда-иш. Вот бы лямбда-выражение:

albums.OrderBy (а => a.Discs.First (). Tracks.First (). Title)

Я использовал переменную 'a' для обозначения альбома, но вы можете использовать любую переменную, это идентично первому выражению:

albums.OrderBy (альбом => album.Discs.First (). Tracks.First (). Title)

или вы можете использовать from obj в форме obj как упоминание в других ответах.

0 голосов
/ 04 марта 2009

Извините,

Похоже, что метод OrderBy, о котором я спрашиваю и пытаюсь использовать, специфичен для используемого нами ORM (genom-e) и не отражается в классах .net Queryable или IEnumerable (в отличие от большинства genom -e функциональность LINQ). Не существует перегрузки OrderBy, которая принимает строку в .net, это характерно для genom-e.

Те из вас, кто использует .net, сталкиваясь с подобной проблемой, вероятно, могут попробовать один из двух приведенных выше ответов .

0 голосов
/ 03 марта 2009

Как насчет этого, чтобы удовлетворить вашу потребность в исходном запросе, который не выполняет сортировку? При этом используются анонимные типы для хранения информации об альбоме, а также название первого трека, чтобы вы могли отсортировать его позже.

var query = from album in albums
            let disc = album.Discs.First()
            let track = disc.Tracks.First()
            select new { Album = album, FirstTrack = track.Title };

var sortedQuery = from album in query
                  order by album.FirstTrack
                  select album.Album;
...