LinqDataSource-我们可以限制返回的记录数量吗?

时间:2020-03-05 18:38:12  来源:igfitidea点击:

我想在页面上使用LinqDataSource控件并限制返回的记录数量。我知道如果我在后面使用代码,可以执行以下操作:

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

有谁知道使用LinqDataSource控件是否可以实现这种目的?

[更新]

我将把LinqDataSource和ListView控件一起使用,而不是GridView或者Repeater。 " LinqDataSource"向导不提供限制返回记录数的功能。 "高级"选项仅允许我们启用删除,插入和更新。

解决方案

回答

我知道,如果我们将分页转发器或者gridview与linqdatasource一起使用,它将自动优化返回的结果数,但是我也很确定在数据源向导中我们可以转到高级选项并将其限制为

SELECT TOP 3 FROM

这应该可以让我们做所需的事情

回答

是的,没有。

不,我们不能在LinqDataSource控件内限制结果。因为Linq使用延迟执行,所以期望表示控件将执行记录集限制。

是的,我们可以使用ListView控件执行此操作。诀窍是在LayoutTemplate中使用DataPager控件,如下所示:

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

通常,我们将在DataPager中包含控件,例如first,last,next和previous。但是,如果只是将其设为空,那么我们只会看到所需的三个结果。

希望这可以帮助。

回答

我有同样的问题。我解决这个问题的方法是在LinqDataSource上使用Selecting事件并手动返回结果。

例如

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);
}

回答

我们可以将Linq查询基于仅使用TOP语句返回x行数的存储proc。请记住,因为我们可以在Linq中完成所有数据库代码,但这并不意味着我们应该这样做。另外,我们可以告诉Linq对存储的proc使用与普通表相同的返回类型,因此所有绑定仍将起作用,并且返回结果将为相同类型