2012-06-08 15 views
8

Estoy trabajando en una aplicación ASP.NET y estoy creando una consulta LINQ que seleccionará registros paginados de db. en la interfaz de usuario tengo un cuadro de lista donde el usuario puede seleccionar múltiples opciones. Quiero saber:Linq a Entidades Skip() y Take()

  • ¿Cómo puedo incrementar los parámetros Skip(), Take() para ver los próximos resultados?

  • ¿Cómo puedo usar la palabra clave "IN" para que si el usuario selecciona múltiples opciones del cuadro de lista, la consulta puede verificar todos los valores?

Mi consulta es el siguiente:

var searchResults = context.data_vault.Where(d => d.STATE == lstStates.SelectedItem.Text).OrderBy(d= > d.dv_id).Take(10).Skip(2);  
GridView1.DataSource = searchResults; 
GridView1.DataBind(); 
+0

Necesitas primera llamada saltar y luego tomar. En su implementación actual, siempre recuperará los elementos del 3 al 10, porque toma los primeros 10 y de los que omite los dos primeros. Para incrementar, solo necesita proporcionar el valor de omisión como parámetro de su método donde se ejecuta la consulta. – Franky

Respuesta

7

lo necesario para convertir paginación en la primera GridView. A continuación, en caso PageIndexChanging:

var result = db.Where(...) 
       .Skip(e.NewPageIndex * grid.PageSize) 
       .Take(grid.PageSize) 
       .ToList(); // this is very important part too 

para emular el comportamiento IN:

var selection = list.SelectedItems.Select(i => i.Text).ToArray(); 
var result = db.Where(x => selection.Contains(x.Prop)); 
+1

Agregue los paréntesis de cierre en la segunda consulta. 'db.Where (x => selection.Contains (x.Prop));' –

+0

@NikhilAgrawal: Gracias. – abatishchev

+2

¿El downvoter se preocupa por comentar? – abatishchev

19

Creo que está utilizando Saltar incorrectamente. Debería ser antes de la toma.

Skip omite una serie de registros, por lo que para su primera página, pase 0, o pase el (número de página - 1) * registros por página.

por lo general hago algo como esto:

int Page = 1; 
int RecordsPerPage = 10; 
var q = yourQuery.Skip((Page - 1) * RecordsPerPage).Take(RecordsPerPage); 
1

Prueba esto:

int temp = (CurrentPageNumber - 1) * 10; 
    var searchResults = context.data_vault.Where(d => d.STATE == lstStates.SelectedItem.Text).OrderBy(d= > d.dv_id).Skip(temp).Take(10);