2008-08-07 12 views
27

Me gustaría utilizar un control LinqDataSource en una página y limitar la cantidad de registros devueltos. Sé que si utilizo código detrás de lo que podía hacer algo como esto:LinqDataSource - ¿Se puede limitar la cantidad de registros devueltos?

IEnumerable<int> values = Enumerable.Range(0, 10); 
IEnumerable<int> take3 = values.Take(3); 

¿Alguien sabe si algo como esto es posible con un control LinqDataSource?

[Actualización]

Voy a utilizar el LinqDataSource con el control ListView, no un GridView o repetidor. El asistente LinqDataSource no proporciona la capacidad de limitar el número de registros devueltos. Las opciones avanzadas solo le permiten habilitar eliminaciones, inserciones y actualizaciones.

Respuesta

1

Sé que si utiliza un repetidor de paginación o gridview con el linqdatasource optimizará automáticamente el número de resultados devueltos, pero también estoy bastante seguro de que en el asistente de fuente de datos puede ir a opciones avanzadas y limitarlo a

SELECT TOP 3 FROM 

que debería permitirle hacer lo que necesita

12

y Sin.

No, no puede limitar los resultados dentro del control LinqDataSource. Debido a que Linq usa la ejecución diferida, la expectativa es que el control de la presentación cumpla con los límites del conjunto de registros.

, puede hacer esto con un control ListView. El truco es usar el control DataPager dentro del LayoutTemplate, así:

<LayoutTemplate> 
    <div id="itemPlaceholder" runat="server" /> 
    <asp:DataPager ID="DataPager1" runat="server" PageSize="3"> 
    </asp:DataPager>    
</LayoutTemplate> 

Normalmente, se incluyen controles dentro de la DataPager como primero, último, siguiente y anterior. Pero si lo haces vacío, solo verás los tres resultados que deseas.

Espero que esto ayude.

+1

siento que tengo una Q en su respuesta. Si uso tu solución, ¿puedes contarme sobre el peso de la página? LinqDataSource selecciona todos los registros, pero ListView solo muestra 3 registros.¿es una sobrecarga en la página? – mahdiahmadirad

22

Tuve este mismo problema. La forma en que solucioné esto fue usar el evento Selecting en LinqDataSource y devolver el resultado manualmente.

p. Ej.

protected void lnqRecentOrder_Selecting(object sender, LinqDataSourceSelectEventArgs e) 
{ 
    DataClassesDataContext dx = new DataClassesDataContext(); 
    e.Result = (from o in dx.Orders 
       where o.CustomerID == Int32.Parse(Request.QueryString["CustomerID"]) 
       select o).Take(5); 
} 
3

Puede basar su consulta Linq en un proceso almacenado que solo devuelve x número de filas utilizando una instrucción TOP. Recuerde que solo porque puede hacer todo su código DB en Linq no significa que deba hacerlo. Además, puede decirle a Linq que use el mismo tipo de retorno para el proceso almacenado que la tabla normal, de modo que toda su vinculación seguirá funcionando, y los resultados de retorno serán del mismo tipo

3

Puede poner evento Selección de LinqDataSource:

protected void ldsLastEntries_Selecting(object sender, LinqDataSourceSelectEventArgs e) 
{ 
    e.Arguments.MaximumRows = 10; 
} 
+0

¡Esta es la respuesta! –

4
protected void DocsData_Selecting(object sender, LinqDataSourceSelectEventArgs e) 
{ 
    e.Arguments.MaximumRows = 5; 
} 
+0

¡Bienvenido a Stack Overflow! En lugar de solo publicar un bloque de código, * explique * por qué este código resuelve el problema planteado. Sin una explicación, esta no es una respuesta. –

+0

¿Puede explicar cómo usar su código, dónde ponerlo? – Al2O3

+0

¡Esta es la respuesta! –

Cuestiones relacionadas