2011-08-08 16 views
14

El uso de VB.net y la siguiente instrucción LINQ. Sospecho que el "Pedido por" no funciona con Concat(). Quiero enumerar el elemento actual que tiene el usuario y luego enumerar más elementos disponibles en orden de compra. Así que primero selecciono el elemento actual de la base de datos y luego selecciono los siguientes elementos disponibles en orden. LINQ está ignorando la orden por declaración y orden por PK (que es itemID). He examinado la lista inmediatamente después de ejecutar la declaración. Cuando rompo la declaración y los hago por separado, funcionan como se predijo. Cualquier idea, sugerencia o comentario. Gracias , PMEl pedido no funciona con Concat() en LINQ

(From items In myDatabase.ItemAssignments _ 
Where items.BuildingID = buildingID _ 
And items.ResidentID = ResidentID _ 
Select items).Concat(From moreitems In myDatabase.ItemAssignments _ 
         Where moreitems.occupied = 0 _ 
         And moreitems.BuildingID = buildingID _ 
         Order by moreitems.Floor, moreitems.ItemNumber _ 
         Select moreitems) 

Respuesta

14

El Concat en efecto, ignorar la orden por la cláusula cuando se trata de LINQ a SQL. Esto se puede verificar desde el SQL generado si está usando LINQPad o configura el DataContext.Log property.

Una forma de resolver esto es introducir un valor ficticio a través de un tipo anónimo para ayudar con el pedido. He dividido las consultas a continuación para mayor claridad, aunque el mismo enfoque es posible usando la sintaxis de consulta con la que comenzó hasta que necesite especificar el orden.

Dim firstQuery = From items In myDatabase.ItemAssignments _ 
       Where items.BuildingID = buildingID _ 
       And items.ResidentID = ResidentID _ 
       Select New With { .Row = items, .Order = 1 } 
Dim secondQuery = From moreitems In myDatabase.ItemAssignments _ 
        Where moreitems.occupied = 0 _ 
        And moreitems.BuildingID = buildingID _ 
        Select New With { .Row = moreitems, .Order = 2 } 

Dim query = firstQuery.Concat(secondQuery) _ 
         .OrderBy(Function(o) o.Order) _ 
         .ThenBy(Function(o) o.Row.Floor) _ 
         .ThenBy(Function(o) o.Row.ItemNumber) _ 
         .Select(Function(o) o.Row) 

Otra opción menos deseable es llamar al AsEnumerable method en una de las consultas, que se tire de los resultados de la base de datos. Dependiendo de la cantidad de elementos involucrados y si se necesita más filtrado, esto puede tener un efecto adverso en el rendimiento.

Para utilizar este este enfoque cambiar la primera parte de su pregunta original para usar:

From items In myDatabase.ItemAssignments.AsEnumerable() ... 

El orden en su segunda parte será entonces funciona como es debido y el SQL generado reflejará tanto.

Cuestiones relacionadas