2009-07-20 5 views
8

je le code d'entité suivante, qui renvoie tous les utilisateurs et « comprend » l'ensemble de leurs demandes d'échantillons:LINQ orderby « .include » en sous-requête

var userQuery = from u in _IntranetContext.UserSet.Include("SampleRequests") 
          orderby u.LastName ascending 
          select u; 

Chaque utilisateur dispose de plusieurs SampleRequests. Chaque SampleRequest a un ID # (juste un entier: 1, 22, 341, etc). Le LINQ ci-dessus à des entités saisit les utilisateurs et leurs SampleRequests comme ceci:

User1: 33, 22, 341, 12

Utilisateur2: 24, 3, 981

Comme vous pouvez le voir l'ID SampleRequest # ne sont pas dans un ordre croissant. Je voudrais que les résultats soient en ordre.

Comment puis-je mettre la contrainte orderby sur Included SampleRequests ID #

S'il vous plaît noter: SampleRequestId est une propriété du SampleRequest ... pas une propriété de l'objet utilisateur

+1

A eu le même problème. Trouvé ... [http://stackoverflow.com/questions/1304556/linq-orderby-name-thenby-childrencollection-name](http://stackoverflow.com/questions/1304556/linq-orderby-name-thenby- childrencollection-name) – kervin

Répondre

8

Je peux actuellement penser à deux options pour ce que vous voulez. Vous pouvez les sélectionner dans une nouvelle classe, où l'utilisateur et les requêtes associées sont des propriétés:

var userQuery = from u in _IntranetContext.UserSet.Include("SampleRequests") 
       orderby u.LastName ascending 
       select new 
       { 
        User = u, 
        SampleRequests = u.SampleRequests.OrderByDescending(r => r.SampleRequestId) 
       }; 

Cela entraînera des problèmes si vous vouliez retourner ce type, comme il est anonyme.

Vous pouvez également sélectionner ceci dans un nouvel objet utilisateur, similaire à ceci:

var userQuery = from u in _IntranetContext.UserSet.Include("SampleRequests") 
       orderby u.LastName ascending 
       select new User 
       { 
        Property1 = u.Property1, 
        Property2 = u.Property2, 
        Property3 = u.Property3, 
        SampleRequests = u.SampleRequests.OrderByDescending(r => r.SampleRequestId).ToList() 
       }; 

Ceci renvoie une collection d'objets de l'utilisateur, mais la mise à jour des objets dans la base de données pourrait causer des problèmes.

+1

Si l'utilisateur est une entité EF, vous ne pouvez pas affecter le résultat de votre appel OrderByDescending(). ToList() (List ) à la propriété SampleRequests sur User, car son type sera EntityCollection . En outre, je me méfierais de l'assignation manuelle de chaque propriété dans la requête; Si vous ajoutez une nouvelle propriété à l'utilisateur plus tard dans la piste et oubliez de mettre à jour toutes vos requêtes, vous obtiendrez des instances d'utilisateur sans cette propriété. IMO ça pourrait être un PITA de maintenance. –

+0

Je trouve cela assez moche si votre User-classe a beaucoup de propriétés. Est-ce que subcollection.ToList() fera beaucoup de transfert entre la logique métier et le sql-server? Une solution pourrait consister simplement à récupérer SampleRequests sans commande, puis à les trier plus tard dans C# -code (= memory). –

+0

Vous devez créer un index de base de données trié à UserSet.LastName. Et une autre à SampleRequests avec (foreign-key to UserSet et SampleRequestId) –

-1

il suffit d'ajouter un autre paramètre de commande au orderby:

var userQuery = from u in _IntranetContext.UserSet.Include("SampleRequests") 
          orderby u.LastName ascending, 
            u.SampleRequestId descending 
          select u; 
+0

Merci, mais SampleRequestId est une propriété de l'exemple SampleRequests, pas de l'objet User. –

+0

@John: C'est la seule réponse que je vois pour ce que vous avez décrit. Je pense que nous avons besoin de plus d'informations en premier. –

+0

OK, j'ai réécrit ma question - je pense qu'il pourrait être un peu plus clair –

-2

Edit: Treed par < 15 secondes.

var userQuery = from u in _IntranetContext.UserSet.Include("SampleRequests") 
       orderby u.LastName ascending, u.SampleRequestId descending 
       select u; 
+0

Merci, mais SampleRequestId est une propriété de l'exemple SampleRequests, pas de l'objet Utilisateur. –

Questions connexes