2008-12-08 10 views
13

¿Es posible utilizar la funcionalidad "paginación" en las consultas de Linq? Digamos que tengo un poco de XML como esto:Pregunta de Novato LINQ: ¿Es posible la localización en consultas LINQ?

<Root> 
    <BetaSection> 
     <Choices> 
      <SetA> 
       <Choice id="choice1">Choice One</Choice> 
       <Choice id="choice2">Choice Two</Choice> 
       <Choice id="choice3">Choice Three</Choice> 
       . 
       . 
       . 
       <Choice id="choice48">Choice Forty-Eight</Choice> 
       <Choice id="choice49">Choice Forty-Nine</Choice> 
       <Choice id="choice50">Choice Fifty</Choice> 
      </SetA> 
     </Choices> 
    </BetaSection> 
</Root> 

Si quería implementar la funcionalidad de paginación, iba a ser capaz de proporcionar un desplazamiento a una consulta LINQ tal que pudiera empezar en el elemento 11 y terminará el día 20 ¿elemento? De ser así, ¿la consulta sería diferente si los datos fueran una lista de objetos en lugar de XML?

+0

paginación por linq es posible. No sé lo que intentas lograr.si hay grandes registros guardados en el archivo xml y desea buscar datos desde allí por linq con paginación, entonces no es posible. la mayoría de las veces la gente usa la clase de doc. xml para leer el archivo xml y luego carga la información completa de xml en la memoria. eso no se debe considerar como paginación cuando la carga de datos completa en la memoria. linq solo leerá algunos datos de la memoria y regresará ........ pero esto no puede decirse como pagination.pagination significa que cargaré solo algunos datos en la memoria que mostraré o con los que trabajaré. – Thomas

Respuesta

18
var q = from X in Choices.Skip((page-1)*pageSize).Take(pageSize) 
     select X; 

Ahora, si usted necesita una cláusula where en ella, se pone un poco más complicado:

var q = (from X in Choices 
     where x.SomeField == SomeValue 
     select X).Skip((page-1)*pageSize).Take(pageSize); 
+1

Para su segundo caso, probablemente sea más fácil simplemente usar métodos de extensión, en lugar de mezclar en la sintaxis del lenguaje: var q = Choices.Where (x => x.SomeField == SomeValue) .Skip ((página - 1) * pageSize). Tomar (tamaño de página); –

+0

En el primer caso, puede eliminar 'de X in' y' seleccionar X'. –

+1

¿Funcionará esto al aplicar orderby? Quiero decir que espero que Linq primero aplique orderby y luego omita y tome ... – Andry

2
var pagedData = aDataSource.Skip(20).Take(10); 

De esta manera, va a omitir 20 elementos y tomar el siguiente 10

1

La "toma" y "skip" métodos de extensión prevén.

myQueryable = myQueryable.Skip(10).Take(10); 
3

Absolutamente - Skip() y Take() lograr la paginación, y son compatibles con bastante-mucho todo Proveedores LINQ.

En este caso, parece que está utilizando LINQ-to-Xml, así que no dude en ignorar el siguiente bit, pero para información general: tenga en cuenta que si los datos provienen de una base de datos mediante un procedimiento almacenado, es difícil de buscar en el servidor. Sin embargo, puede componer (es decir, página) "UDF" s. LINQ-to-SQL admite UDF (a través de [FunctionAttribute]), pero no Entity Framework. Si está utilizando consultas de bases de datos generadas automáticamente, esto no es un problema.

Tenga en cuenta que con XML, también se puede hacer mucho con XPath - aquí usando XmlDocument:

foreach (XmlElement el in doc.SelectNodes(
    "/Root/BetaSection/Choices/SetA/Choice[position() > 11 and position() < 20]")) 
{ 
    Console.WriteLine(el.GetAttribute("id")); 
} 

o con Skip()/Take() (aún con XmlDocument):

foreach (var el in doc.SelectNodes(
    "/Root/BetaSection/Choices/SetA/Choice").Cast<XmlElement>() 
    .Skip(10).Take(10)) 
{ 
    Console.WriteLine(el.GetAttribute("id")); 
} 
+0

he visto su código, pero cuando trabajamos con la clase xmldoc para cargar y leer el archivo xml, primero todos los datos se cargan en la memoria. si todos los datos se cargan en la memoria y seleccionan algunos de allí con la función de omitir y tomar ...... ¿realmente se considera como paginación? pagination significa que cargaré solo algunos datos en la memoria que mostraré o con los que trabajaré. – Thomas

1

sí lo es . Habría que conseguir el XML en un formato de origen de datos apropiado y entonces este hilo sobre los foros de MSDN debe proporcionar las medidas necesarias para darle la capacidad sobre la forma de ponerlo en práctica ...

MSDN - LINQ with pagination

3

Take una mirada a los métodos Queryable.Skip y Queryable.Take.

También vea esto útil extension methods para paginación,

con que los métodos que usted puede hacer esto de esta manera:

List<string> names = new List<string>(); 
names.AddRange(new string[]{"John","Frank","Jeff","George","Bob","Grant", "McLovin"}); 

foreach (string name in names.Page(2, 2)) 
{ 
    Console.WriteLine(name); 
} 
3

James Curran tiene razón, puede simplificar de que mediante la creación de un método de extensión para su reutilización mas tarde.

También podría modificar el código para devolverle un objeto que puede rastrear cuántos elementos están en total en la lista y cuántas páginas deberían estar basadas en pageSize y pageIndex.

public static IQueryable<T> ToPageOfList<T>(this IQueryable<T> source, int pageIndex, int pageSize) 
{ 
    return source.Skip(pageIndex * pageSize).Take(pageSize); 
} 

//Example 
var g = (from x in choices select x).ToPageOfList(1, 20);