BatchQuery
This method queries rows from the database in batches.
This method queries rows from the database in batches.
Code Snippets
The following example queries the first batch of 20 active rows from the [dbo].[Person] table, ordered by creation date.
using (var connection = new SqlConnection(connectionString))
{
var orderBy = OrderField.Parse(new { DateInsertedUtc = Order.Descending });
var page = 0; // Starts at 0 for the first batch
var rowsPerBatch = 20;
var people = connection.BatchQuery<Person>(page: page,
rowsPerBatch: rowsPerBatch,
orderBy: orderBy,
where: e => e.IsActive == true);
}
Paging starts at 0.
The following example queries the third batch.
using (var connection = new SqlConnection(connectionString))
{
var orderBy = OrderField.Parse(new { DateInsertedUtc = Order.Descending });
var page = 2;// This is the 3rd batch
var rowsPerBatch = 20;
var people = connection.BatchQuery<Person>(page: page,
rowsPerBatch: rowsPerBatch,
orderBy: orderBy,
where: e => e.IsActive == true);
}
Targeting a Table
To target a specific table, pass the literal table name.
using (var connection = new SqlConnection(connectionString))
{
var orderBy = OrderField.Parse(new { DateInsertedUtc = Order.Descending });
var page = 0;
var rowsPerBatch = 20;
var people = connection.BatchQuery<Person>("Person",
page: page,
rowsPerBatch: rowsPerBatch,
orderBy: orderBy,
where: e => e.IsActive == true);
}
Or via dynamics.
using (var connection = new SqlConnection(connectionString))
{
var orderBy = OrderField.Parse(new { DateInsertedUtc = Order.Descending });
var page = 0;
var rowsPerBatch = 20;
var people = connection.BatchQuery("Person",
page: page,
rowsPerBatch: rowsPerBatch,
orderBy: orderBy,
where: new { IsActive = true });
}
Specific Columns
To query specific columns, pass a list of fields.
using (var connection = new SqlConnection(connectionString))
{
var orderBy = OrderField.Parse(new { DateInsertedUtc = Order.Descending });
var page = 0;
var rowsPerBatch = 20;
var fields = Field.Parse<Person>(e => new
{
e.Id,
e.Name,
e.DateInsertedUtc
});
var people = connection.BatchQuery<Person>(page: page,
rowsPerBatch: rowsPerBatch,
orderBy: orderBy,
where: e => e.IsActive == true,
fields: fields);
}
Or via dynamics.
using (var connection = new SqlConnection(connectionString))
{
var orderBy = OrderField.Parse(new { DateInsertedUtc = Order.Descending });
var page = 0;
var rowsPerBatch = 20;
var people = connection.BatchQuery("Person",
page: page,
rowsPerBatch: rowsPerBatch,
orderBy: orderBy,
where: new { IsActive = true },
fields: Field.From("Id", "Name", "DateInsertedUtc"));
}
Filtering the Results
Use QueryGroup or QueryField to build more complex WHERE expressions.
using (var connection = new SqlConnection(connectionString))
{
var where = new []
{
new QueryField("IsActive", true),
new QueryField("DateInsertedUtc", Operation.GreaterThanOrEqual, DateTime.UtcNow.Date.AddDays(-1))
};
var orderBy = OrderField.Parse(new { DateInsertedUtc = Order.Descending })
var page = 0;
var rowsPerBatch = 20;
var people = connection.BatchQuery("Person",
page: page,
rowsPerBatch: rowsPerBatch,
orderBy: orderBy,
where: where);
}
Table Hints
Pass a table hint via the hints argument.
using (var connection = new SqlConnection(connectionString))
{
var orderBy = OrderField.Parse(new { DateInsertedUtc = Order.Descending });
var page = 0;
var rowsPerBatch = 20;
var people = connection.BatchQuery<Person>(page: page,
rowsPerBatch: rowsPerBatch,
orderBy: orderBy,
where: e => e.IsActive == true,
hints: "WITH (NOLOCK)");
}
Or use the SqlServerTableHints class.
using (var connection = new SqlConnection(connectionString))
{
var orderBy = OrderField.Parse(new { DateInsertedUtc = Order.Descending });
var page = 0;
var rowsPerBatch = 20;
var people = connection.BatchQuery<Person>(page: page,
rowsPerBatch: rowsPerBatch,
orderBy: orderBy,
where: e => e.IsActive == true,
hints: SqlServerTableHints.NoLock);
}