2009-03-03 8 views
1

Si j'ai une structure comme celle-Utiliser [0] Premier() avec LINQ OrderBy

  Albums
       -  Album
               -  Disques
                        -   Tracks

et je veux commander une collection d'albums par le titre de la première piste sur le premier disque.

Y at-il quelque chose de similaire à ce que je pourrais faire (en gardant à l'esprit que j'ai besoin d'utiliser la méthode d'extension OrderBy qui accepte une chaîne)?

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

Je dois être en mesure de trier en utilisant une expression de chaîne ainsi la nécessité d'utiliser la méthode OrderBy à savoir albums.OrderBy (« Track [0] .title »). La raison en est que notre cadre personnalisé utilise une expression de tri (par exemple "Titre") renvoyée par un GridView qui est recherché dans un dictionnaire (par exemple "Track [0] .Title") pour obtenir la bonne commande par clause. C'est-à-dire que le champ et la direction du tri sont déterminés dynamiquement au moment de l'exécution.

ou

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

Pourquoi devez-vous utiliser la chaîne de surcharge qui accepte une chaîne? La réponse de Marc semble juste pour cela. – configurator

Répondre

3

Untested, mais que diriez-vous:

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

Malheureusement, je ne peux pas utiliser orderby en ligne dans la requête. Il doit être appliqué après la requête initiale. J'ai essayé d'utiliser votre requête avec la ligne orderby supprimée et en substituant à la place en utilisant query = query.OrderBy ("track.Title") mais cela n'a pas fonctionné. –

0

Qu'en est-ce, afin de satisfaire votre besoin d'une requête initiale qui ne fonctionne pas le tri? Cela utilise des types anonymes pour stocker les informations de l'album, plus le nom de la première piste afin que vous puissiez le trier plus tard.

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

J'ai besoin d'utiliser la méthode query.OrderBy (string) ce qui est utilisé pour la commande est déterminé dynamiquement à l'exécution. Désolé, j'aurais probablement dû le préciser dans la question initiale. –

0

personnes Désolé,

Il ressemble à la méthode OrderBy que je pose au sujet et d'essayer d'utiliser est spécifique à l'ORM (genom-e) que nous utilisons et ne se reflète pas sur le. net Queryable ou IEnumerable (contrairement à la majorité des fonctionnalités LINQ de genom-e). Il n'y a pas de surcharge OrderBy qui accepte une chaîne dans .net, c'est spécifique à genom-e.

Ceux d'entre vous utilisant .net rencontrant un problème similaire devraient probablement donner une des deux réponses ci-dessus un essai.

2

LINQ dispose de deux méthodes pour interroger les expressions "from. In .." et Lambda. De la façon dont vous étiez en train d'écrire, il semblait lambda-ish. Voici l'expression Lambda:

albums.OrderBy (a => a.Discs.First(). Tracks.First().Titre)

J'utilise la variable 'a' pour indiquer album mais vous pouvez utiliser une variable, elle est identique à la première expression:

albums.OrderBy (album => album.Discs.First() .Tracks.First(). Titre)

ou vous pouvez utiliser le obj de la forme obj comme mention dans les autres réponses.

Questions connexes