2009-07-20 20 views
8

tengo el siguiente código de entidad, que devuelve todos los usuarios y 'comprende' todas sus solicitudes de muestras:LINQ orderby ".include" en subconsulta

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

Cada usuario tiene varias SampleRequests. Cada SampleRequest tiene un ID # (solo un entero: 1, 22, 341, etc.). El LINQ arriba para entidades agarra los usuarios y sus SampleRequests así:

Usuario1: 33, 22, 341, 12

Usuario 2: 24, 3, 981

Como se puede ver la SampleRequest ID # no están en orden ascendente Me gustaría que los resultados estén en orden.

¿Cómo puedo poner la restricción en el OrdenarPor Incluido SampleRequests ID #

Tenga en cuenta: SampleRequestId es una propiedad de la SampleRequest ... no es una propiedad del objeto de usuario

+1

Tenía el mismo problema. Encontrado ... [http://stackoverflow.com/questions/1304556/linq-orderby-name-thenby-childrencollection-name](http://stackoverflow.com/questions/1304556/linq-orderby-name-thenby- childrencollection-name) – kervin

Respuesta

8

Actualmente puedo pensar en dos opciones para lo que desea. Puede seleccionarlos en una nueva clase, donde el usuario y las solicitudes asociadas son propiedades:

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

Esto provocará problemas si desea regresar este tipo, ya que es anónima.

También puede seleccionar esto en un nuevo objeto de usuario, similar a esto:

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() 
       }; 

Esto devolverá una colección de objetos de usuario, pero la actualización de los objetos en la base de datos podría causar problemas.

+1

Si el usuario es una entidad EF, no puede asignar el resultado de su llamada OrderByDescending(). ToList() (una lista ) a la propiedad SampleRequests en User, ya que su tipo será EntityCollection . Además, sería cauteloso al asignar manualmente cada propiedad en la consulta; si agrega una nueva propiedad al usuario más adelante en la pista y olvida actualizar todas sus consultas, obtendrá instancias de usuario sin esa propiedad asignada. IMO podría ser un PITA de mantenimiento. –

+0

Encuentro esto bastante feo si su clase de usuario tiene muchas propiedades. ¿Esta subcollection.ToList() hará una gran transferencia entre la lógica de negocios y el servidor sql? Una solución podría ser obtener Solicitudes de Muestras sin orden y luego ordenarlas más tarde en C# -code (= memoria). –

+0

Debe crear un índice de base de datos ordenada para UserSet.LastName. Y otra a SampleRequests con (clave externa a UserSet y SampleRequestId) –

-1

Sólo añadir otro parámetro de ordenación a la orderby:

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

Gracias, pero SampleRequestId es una propiedad de SampleRequests include, no del objeto User. –

+0

@John: esta es la única respuesta que veo para lo que describes. Creo que necesitamos más información primero. –

+0

OK, reescribí mi pregunta, creo que podría ser un poco más claro –

-2

Editar: Treed por < 15 segundos.

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

Gracias, pero SampleRequestId es una propiedad de SampleRequests include, no del objeto User. –

Cuestiones relacionadas