如何使用.NET使用SQLReader通过切片读取查询结果

时间:2017-03-02 07:27:46

标签: c# sql sqldatareader

listview.ItemAppearing += (sender, e) => 
{
    // Check if you reach the bottom
    if(e.Item == lastitem)
    {
        // load more items
    }
};

我试图通过切片从结果中获取行。 我希望:前五个然后退出脚本。接下来的开始将是第二个五结果(6-10)等。 我如何管理它,例如使用MaxID或某种迭代器。

2 个答案:

答案 0 :(得分:0)

您不能,因为读者需要一个开放且可用的集合来从中获取值。如果您要再次执行查询,则每次都不是更好的做法,您可以使用DataTables来满足此要求。为此,您可以使用以下方法:

// populate the DataTable using adapter
 SqlDataAdapter adapter = new SqlDataAdapter();
 adapter.SelectCommand = new SqlCommand("SELECT TOP 1000 [Id] ,[Name]  FROM [SomeBase]", connection);
 adapter.Fill(dataset);
// Call the method whenever you need Slice
// Which will give you a List<DataRow>
public List<DataRow> GetMySlice(DataTable inputDataTable, int minSlice, int maxSlice)
{
    return inputDataTable.AsEnumerable()
                         .Skip(minSlice)
                         .Take(maxSlice)
                         .ToList();
}

如果您需要将结果作为DataTable,则意味着在这种情况下您可以使用.CopyToDataTable()代替.ToList(),方法的返回类型将为DataTable而不是{{1} }}

答案 1 :(得分:0)

如果你仍然需要分页并使用MS SQL-Server,你可以添加到查询SELECT子句, ROW_NUMBER() OVER (ORDER BY <ColumnName>)并用SELECT *包装它。比使用带参数的WHERE子句。

SELECT * FROM 
(
    SELECT [Id] ,[Name], ROW_NUMBER() OVER (ORDER BY <ColumnName>) AS RNUM FROM [SomeBase]
) AS T
WHERE (T.RNUM BETWEEN @from AND @to)