ISqlExecutor.SelectLazy<TModel>(ISqlQueryBuilder queryBuilder, params object[] parameters) Method
.NET Standard 2.x
Executes the SQL SELECT statement generated by an ISqlQueryBuilder
object and returns an ILazyQueryable<TModel> object that can be used to load the result set lazily.
Namespace: SnapObjects.Data
Assembly: SnapObjects.Data.dll
Syntax
public ILazyQueryable<TModel> SelectLazy<TModel>(ISqlQueryBuilder queryBuilder, params object[] parameters);
Type Parameters
TModel
The datatype of the model object which represents the data row in the result set.
You can also specify DynamicModel to TModel
if you do not want to define a custom model class.
Parameters
queryBuilder
SnapObjects.Data.ISqlQueryBuilder
A SqlQueryBuilder
object which can be used to generate a SQL SELECT statement.
parameters
System.Object[]
(Optional) One or more ParamValue objects which contain the values corresponding to the SQL parameter identifier names.
You can also pass the arguments directly in the order in which they appear in the SQL SELECT statement generated by queryBuilder
without using the ParamValue object.
Returns
SnapObjects.Data.ILazyQueryable<TModel>
Returns an ILazyQueryable<TModel>
object which can load the result set lazily.
Remarks
This method uses command behavior of System.Data.CommandBehavior.SequentialAccess
internally, which provides a way for the DataReader
to handle rows that contain columns with large binary values.
It creates each model object and reads data from database to this model object only when the data is asked for. You can use this method to save resources and improve performance by deferring the initialization of expensive objects until they are requested.
After obtaining the required data, you need to call the ILazyQueryable <Model>.Dispose
method to release the resources occupied by the database connection and DataReader
. Before the returned ILazyQueryable <Model>
object is disposed, the current DataContext
cannot be used for other data operations. Otherwise, an exception will be thrown.
However, in some common cases, you can benefit from C# and do not have to explicitly call the ILazyQueryable <Model>.Dispose
method, for example, when using the C# using
statement or the C# foreach
statement, it can implicitly dispose ILazyQueryable <Model>
.
Examples
The following code example demonstrates how to use the SelectLazy<TModel>(ISqlQueryBuilder, params object[])
method to build and execute the SQL statement using SqlQueryBuilder and get the result set lazily.
using SnapObjects.Data;
using System;
using System.Linq;
namespace Appeon.ApiDoc.ISqlExecutorExamples
{
public class SelectLazyExample
{
private readonly SchoolContext _context;
public SelectLazyExample(SchoolContext dataContext)
{
// Sets the data context
_context = dataContext;
}
public async void Example2()
{
// Creates SqlQueryBuilder.
var builder = new SqlQueryBuilder();
// Defines the select list.
string[] columns = { "CourseID", "Title" };
// Defines the SQL statement.
builder.Select(columns)
.From("Course")
.Where("CourseID", SqlBuilder.Parameter<int>("id"));
// Executes the SQL statement. It doesn't get the result set from database.
// Gets each row of the result set from database one by one.
// It creates each model object and reads data from database to
// this model object only when the data is asked for.
// This method is usually used to handle rows that contain columns
// with large binary values.
// No need to close the connection explicitly as 'using' can dispose result1 automatically.
#if NETSTANDARD2_0
using (var result = _context.SqlExecutor.SelectLazy<DynamicModel>(builder, 2030))
{
foreach (var model in result)
{
Console.WriteLine("Title: {0}.", model.GetValue<string>(1));
}
}
#elif NETCOREAPP3_1
await using (var result = _context.SqlExecutor.SelectLazy<DynamicModel>(builder, 2030))
{
await foreach (var model in result)
{
Console.WriteLine("Title: {0}.", model.GetValue<string>(1));
}
}
#endif
/*This code produces the following output:
Title: Poetry.
*/
}
}
}
Applies to
.NET Standard
2.x