2009-03-03 2 views
1

Если у меня есть структуру, подобную этойИспользуя [0] или первых() с LINQ OrderBy

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

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

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

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

мне нужно, чтобы иметь возможность сортировать, используя выражение строки, таким образом, необходимость в использовании метода OrderBy т.е. albums.OrderBy («Трек [0] .title»). Причина этого заключается в том, что наша пользовательская инфраструктура использует выражение сортировки (например, «Заголовок»), переданное обратно из GridView, которое просматривается в словаре (например, «Трек [0] .Title»), чтобы получить правильное предложение order by. То есть, поле и направление сортировки динамически определяются во время выполнения.

или

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

Почему вы должны использовать строку перегрузки, которая принимает строку? Ответ Марка кажется правильным для этого. – configurator

ответ

3

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

var query = from album in albums 
       let disc = album.Discs.First() 
       let track = disc.Tracks.First() 
       orderby track.Title 
       select album; 
+0

К сожалению, я не могу использовать orderby inline в запросе. Он должен применяться после первоначального запроса. Я попытался использовать ваш запрос с удаленной строкой orderby и вместо этого заменил query = query.OrderBy («track.Title») , но это не сработало. – 2009-03-03 02:33:48

0

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

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; 
+0

Мне нужно использовать метод query.OrderBy (string), который используется для упорядочения, динамически определяется во время выполнения. Извините, я, вероятно, должен был сделать это более ясным в исходном вопросе. – 2009-03-04 07:01:39

0

К сожалению люди,

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

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

2

LINQ имеет два способа запроса «from. In ..» и лямбда-выражения. Они, как вы почти писали, выглядели Лямбда-иш. Здесь должно быть выражение Лямбды:

albums.OrderBy (a => a.Discs.First(). Tracks.First().Название)

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

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

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