2011-12-29 13 views
6

Tengo una colección de números ID para los cuales deseo devolver algún objeto, lo hago usando una instrucción linq con un donde eso es usando una instrucción contiene:Linq Donde contiene ... Mantener el orden por defecto

var recentCats = (from i in EntityCache.Default.GetAll<Categories>() 
          where WebProfile.Current.RecentlyCreatedCategories.Contains(i.Id) 
          && BoundCategory.ParentItemClass.Id.Equals(i.ParentItemClass.Id) 
          select new CategoryInfo() 
          { 
           Category = i, 
           ClassId = i.ParentItemClass.Id, 
           ClassImage = NamedResourceManager.GetResourceBinary(i.ParentItemClass.NameResourceId) 
          }); 

Esto funciona perfectamente bien, excepto que quiero mantener el orden de los elementos en la colección devuelta lo mismo que estaban en la lista que entra. Entonces, por ejemplo, si tuviera una lista de ID: 14, 603, 388, quiero que los objetos que vuelven estén en el mismo orden, no el orden en que los devuelve el caché. ¿Hay alguna forma en el marco de la entidad para hacer esto, o cualquier forma de hacerlo que no implique que escriba un ciclo foreach?

Gracias

+0

Lo siento, no tengo tiempo para una respuesta completa, pero puedo darle una pista. Implica unir su lista de ID en la lista de categorías en lugar de utilizar 'where ... contains' – Ray

+0

Creo que el problema aquí es que no hay un pedido para SQL, a menos que lo ordene explícitamente. SQL puede devolver en cualquier orden, por lo que no hay un orden predeterminado para mantener. – Euphoric

Respuesta

1

Para cualquier persona interesada, pude hacer que salgan en el mismo orden que la lista al unirme a ellos, como mencionó Ray en los comentarios anteriores.

var recentCats = (from i in WebProfile.Current.RecentlyCreatedCategories 
           join b in allCats 
           on i equals b.Id 
           where BoundCategory.ParentItemClass.Id.Equals(b.ParentItemClass.Id) 
           select ... 

Gracias de nuevo por toda su ayuda & respuestas.

3

El Donde extensión LINQ al igual que con la mayoría de las extensiones mantiene el orden original de la lista.

Do LINQ's Enumerable Methods Maintain Relative Order of Elements?

Siempre y cuando no se reordena de forma explícita o utilizar un operador que, naturalmente, sería reordenar el orden de la lista original debe ser mantenido. Obviamente, reordenar la lista para una declaración Where sería innecesario por encima.


El motivo por el que la información anterior no se aplica a esta pregunta se encuentra en los comentarios a continuación. Sugeriría cambiar la salida de la selección para que sea un par de clave/valor, donde la clave es el índice del Id en su lista, y el valor es su nuevo objeto, luego ordenar la clave en el conjunto resultante y seleccionar el valor.

+0

Eso es LINQ to Objects. Está usando EF, que devolverá el pedido desde SQL Server. – SLaks

+0

@SLaks gracias por la información, he editado mi respuesta con una posible solución. – Gent

+0

Gracias por la explicación y el enlace. Aunque no es exactamente lo que estoy buscando, ya que no creo que fuera lo suficientemente específico en mi pregunta. Por el momento, mis resultados están regresando en el orden en que están en el caché, ya que esa es la consulta que estoy ejecutando; quería que estuvieran en el orden de la lista que verifico en su lugar. Puedo hacer eso usando un join como menciona Ray arriba en lugar de la cláusula contains. –