FluentCommand.SqlServer
13.0.0
dotnet add package FluentCommand.SqlServer --version 13.0.0
NuGet\Install-Package FluentCommand.SqlServer -Version 13.0.0
<PackageReference Include="FluentCommand.SqlServer" Version="13.0.0" />
paket add FluentCommand.SqlServer --version 13.0.0
#r "nuget: FluentCommand.SqlServer, 13.0.0"
// Install FluentCommand.SqlServer as a Cake Addin #addin nuget:?package=FluentCommand.SqlServer&version=13.0.0 // Install FluentCommand.SqlServer as a Cake Tool #tool nuget:?package=FluentCommand.SqlServer&version=13.0.0
FluentCommand
Fluent Wrapper for DbCommand.
Package | Version |
---|---|
FluentCommand | |
FluentCommand.SqlServer | |
FluentCommand.Json |
Download
The FluentCommand library is available on nuget.org via package name FluentCommand
.
To install FluentCommand, run the following command in the Package Manager Console
PM> Install-Package FluentCommand
More information about NuGet package available at https://nuget.org/packages/FluentCommand
Features
- Fluent wrapper over DbConnection and DbCommand
- Callback for parameter return values
- Automatic handling of connection state
- Caching of results
- Automatic creating of entity from DataReader via Dapper
- Create Dynamic objects from DataReader via Dapper
- Handles multiple result sets
- Basic SQL query builder
- Source Generate DataReader
Configuration
Configuration for SQL Server
IDataConfiguration dataConfiguration = new DataConfiguration(
SqlClientFactory.Instance,
ConnectionString
);
Register with dependency injection
services.AddFluentCommand(builder => builder
.UseConnectionString(ConnectionString)
.UseSqlServer()
);
Register using a connection name from the appsettings.json
services.AddFluentCommand(builder => builder
.UseConnectionName("Tracker")
.UseSqlServer()
);
{
"ConnectionStrings": {
"Tracker": "Data Source=(local);Initial Catalog=TrackerTest;Integrated Security=True;TrustServerCertificate=True;"
}
}
Register for PostgreSQL
services.AddFluentCommand(builder => builder
.UseConnectionName("Tracker")
.AddProviderFactory(NpgsqlFactory.Instance)
.AddPostgreSqlGenerator()
);
Example
Query all users with email domain. Entity is automatically created from DataReader.
string email = "%@battlestar.com";
string sql = "select * from [User] where EmailAddress like @EmailAddress";
var session = configuration.CreateSession();
var user = await session
.Sql(sql)
.Parameter("@EmailAddress", email)
.QuerySingleAsync(r => new User
{
Id = r.GetGuid("Id"),
EmailAddress = r.GetString("EmailAddress"),
IsEmailAddressConfirmed = r.GetBoolean("IsEmailAddressConfirmed"),
DisplayName = r.GetString("DisplayName"),
PasswordHash = r.GetString("PasswordHash"),
ResetHash = r.GetString("ResetHash"),
InviteHash = r.GetString("InviteHash"),
AccessFailedCount = r.GetInt32("AccessFailedCount"),
LockoutEnabled = r.GetBoolean("LockoutEnabled"),
LockoutEnd = r.GetDateTimeOffsetNull("LockoutEnd"),
LastLogin = r.GetDateTimeOffsetNull("LastLogin"),
IsDeleted = r.GetBoolean("IsDeleted"),
Created = r.GetDateTimeOffset("Created"),
CreatedBy = r.GetString("CreatedBy"),
Updated = r.GetDateTimeOffset("Updated"),
UpdatedBy = r.GetString("UpdatedBy"),
RowVersion = r.GetBytes("RowVersion"),
});
Execute a stored procedure with out parameters
Guid userId = Guid.Empty;
int errorCode = -1;
var username = "test." + DateTime.Now.Ticks;
var email = username + "@email.com";
var session = configuration.CreateSession();
var result = session
.StoredProcedure("[dbo].[aspnet_Membership_CreateUser]")
.Parameter("@ApplicationName", "/")
.Parameter("@UserName", username)
.Parameter("@Password", "T@est" + DateTime.Now.Ticks)
.Parameter("@Email", email)
.Parameter("@PasswordSalt", "test salt")
.Parameter<string>("@PasswordQuestion", null)
.Parameter<string>("@PasswordAnswer", null)
.Parameter("@IsApproved", true)
.Parameter("@CurrentTimeUtc", DateTime.UtcNow)
.Parameter("@UniqueEmail", 1)
.Parameter("@PasswordFormat", 1)
.ParameterOut<Guid>("@UserId", p => userId = p)
.Return<int>(p => errorCode = p)
.Execute();
Query for user by email address. Also return Role and Status entities.
string email = "kara.thrace@battlestar.com";
string sql = "select * from [User] where EmailAddress = @EmailAddress; " +
"select * from [Status]; " +
"select * from [Priority]; ";
User user = null;
List<Status> status = null;
List<Priority> priorities = null;
var session = configuration.CreateSession();
session
.Sql(sql)
.Parameter("@EmailAddress", email)
.QueryMultiple(q =>
{
user = q.QuerySingle<User>();
status = q.Query<Status>().ToList();
priorities = q.Query<Priority>().ToList();
});
Query Builder
Build SQL statements with the query builder. Query builder uses the DataAnnotations Schema attributes to extract table and column information.
var session = configuration.CreateSession();
string email = "kara.thrace@battlestar.com";
var user = await session
.Sql(builder => builder
.Select<User>() // table name comes from type
.Where(p => p.EmailAddress, email)
)
.QuerySingleAsync<User>();
Count query
string email = "kara.thrace@battlestar.com";
var count = await session
.Sql(builder => builder
.Select<User>()
.Count()
.Where(p => p.EmailAddress, email)
)
.QueryValueAsync<int>();
Insert statement
var id = Guid.NewGuid();
var userId = await session
.Sql(builder => builder
.Insert<User>()
.Value(p => p.Id, id)
.Value(p => p.EmailAddress, $"{id}@email.com")
.Value(p => p.DisplayName, "Last, First")
.Value(p => p.FirstName, "First")
.Value(p => p.LastName, "Last")
.Output(p => p.Id) // return key as output value
.Tag() // add comment tag to query
)
.QueryValueAsync<Guid>();
Update statement
var updateId = await session
.Sql(builder => builder
.Update<User>()
.Value(p => p.DisplayName, "Updated Name")
.Output(p => p.Id)
.Where(p => p.Id, id)
.Tag()
)
.QueryValueAsync<Guid>();
Delete statement
var deleteId = await session
.Sql(builder => builder
.Delete<User>()
.Output(p => p.Id)
.Where(p => p.Id, id)
.Tag()
)
.QueryValueAsync<Guid>();
Source Generator
The project supports generating a DbDataReader from a class via an attribute. Add the TableAttribute
to a class to generate the needed extension methods.
[Table("Status", Schema = "dbo")]
public class Status
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public int DisplayOrder { get; set; }
public bool IsActive { get; set; }
public DateTimeOffset Created { get; set; }
public string CreatedBy { get; set; }
public DateTimeOffset Updated { get; set; }
public string UpdatedBy { get; set; }
[ConcurrencyCheck]
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
[DataFieldConverter(typeof(ConcurrencyTokenHandler))]
public ConcurrencyToken RowVersion { get; set; }
[NotMapped]
public virtual ICollection<Task> Tasks { get; set; } = new List<Task>();
}
Extension methods are generated to materialize data command to entities
string email = "kara.thrace@battlestar.com";
string sql = "select * from [User] where EmailAddress = @EmailAddress";
var session = configuration.CreateSession();
var user = await session
.Sql(sql)
.Parameter("@EmailAddress", email)
.QuerySingleAsync<User>();
SQL Server Features
PM> Install-Package FluentCommand.SqlServer
Bulk Copy
Using SQL Server bulk copy feature to import a lot of data.
using (var session = configuration.CreateSession())
{
session.BulkCopy("[User]")
.AutoMap()
.Ignore("RowVersion")
.WriteToServer(users);
}
Merge Data
Generate and merge data into a table
var users = generator.List<UserImport>(100);
int rows;
using (var session = configuration.CreateSession())
{
rows = session
.MergeData("dbo.User")
.Map<UserImport>(m => m
.AutoMap()
.Column(p => p.EmailAddress).Key()
)
.Execute(users);
}
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- FluentCommand (>= 13.0.0)
- MicroSoft.Data.SqlClient (>= 5.2.2)
-
net8.0
- FluentCommand (>= 13.0.0)
- MicroSoft.Data.SqlClient (>= 5.2.2)
-
net9.0
- FluentCommand (>= 13.0.0)
- MicroSoft.Data.SqlClient (>= 5.2.2)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on FluentCommand.SqlServer:
Package | Downloads |
---|---|
FluentCommand.Batch
Fluent Wrapper for DbCommand |
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
13.0.0 | 197 | 11/13/2024 |
12.13.2 | 243 | 9/21/2024 |
12.13.1 | 126 | 9/19/2024 |
12.13.0 | 128 | 9/16/2024 |
12.12.0 | 173 | 9/7/2024 |
12.11.0 | 306 | 8/9/2024 |
12.10.8 | 118 | 8/8/2024 |
12.10.7 | 176 | 7/17/2024 |
12.10.6 | 159 | 7/9/2024 |
12.10.5 | 99 | 7/9/2024 |
12.10.4 | 106 | 6/7/2024 |
12.10.3 | 166 | 5/14/2024 |
12.10.2 | 476 | 5/10/2024 |
12.10.1 | 139 | 5/6/2024 |
12.10.0 | 133 | 5/6/2024 |
12.9.1 | 94 | 5/3/2024 |
12.9.0 | 146 | 4/26/2024 |
12.8.0 | 144 | 4/17/2024 |
12.7.0 | 220 | 3/19/2024 |
12.6.0 | 237 | 2/4/2024 |
12.5.0 | 1,204 | 11/24/2023 |
12.4.2 | 168 | 10/28/2023 |
12.4.1 | 204 | 10/12/2023 |
12.4.0 | 138 | 10/12/2023 |
12.3.0 | 3,663 | 9/14/2023 |
12.2.0 | 139 | 9/14/2023 |
12.1.0 | 140 | 9/13/2023 |
12.0.0 | 129 | 9/12/2023 |
12.0.0-beta.1 | 84 | 9/11/2023 |
11.0.0 | 216 | 8/16/2023 |
10.2.0 | 268 | 8/9/2023 |
10.1.6 | 193 | 7/28/2023 |
10.1.5 | 203 | 7/6/2023 |
10.0.707 | 979 | 3/13/2023 |
10.0.702 | 1,070 | 2/23/2023 |
10.0.701 | 380 | 2/23/2023 |
10.0.664 | 815 | 1/31/2023 |
10.0.659 | 483 | 1/25/2023 |
10.0.637 | 682 | 12/28/2022 |
10.0.636 | 429 | 12/27/2022 |
10.0.632 | 515 | 12/19/2022 |
10.0.625 | 448 | 12/13/2022 |
10.0.619 | 571 | 12/7/2022 |
10.0.616 | 518 | 12/6/2022 |
10.0.610 | 508 | 11/30/2022 |
9.5.591 | 748 | 11/9/2022 |
9.5.574 | 537 | 11/7/2022 |
9.5.570 | 516 | 11/6/2022 |
9.5.554 | 760 | 10/21/2022 |
9.5.553 | 617 | 10/20/2022 |
9.5.552 | 664 | 10/19/2022 |
9.5.551 | 619 | 10/19/2022 |
9.5.550 | 605 | 10/18/2022 |
9.5.549 | 614 | 10/18/2022 |
9.5.548 | 637 | 10/18/2022 |
9.5.547 | 580 | 10/17/2022 |
9.5.546 | 585 | 10/17/2022 |
9.5.545 | 621 | 10/16/2022 |
9.5.544 | 601 | 10/15/2022 |
9.5.540 | 611 | 10/15/2022 |
9.0.538 | 678 | 10/11/2022 |
9.0.537 | 631 | 10/10/2022 |
9.0.534 | 634 | 10/9/2022 |
9.0.533 | 610 | 10/7/2022 |
9.0.532 | 658 | 10/3/2022 |
9.0.530 | 671 | 10/2/2022 |
9.0.527 | 661 | 10/1/2022 |
9.0.526 | 624 | 10/1/2022 |
9.0.525 | 645 | 10/1/2022 |
9.0.524 | 629 | 9/30/2022 |
9.0.523 | 643 | 9/30/2022 |
9.0.522 | 661 | 9/30/2022 |
9.0.520 | 660 | 9/29/2022 |
9.0.519 | 683 | 9/29/2022 |
9.0.518 | 657 | 9/29/2022 |
9.0.514 | 692 | 9/29/2022 |
8.0.468 | 825 | 4/23/2022 |
8.0.430 | 478 | 12/22/2021 |
8.0.416 | 502 | 11/18/2021 |
7.0.0.393 | 567 | 10/21/2021 |
7.0.0.359 | 783 | 4/6/2021 |
7.0.0.335 | 568 | 2/15/2021 |
7.0.0.296 | 744 | 11/16/2020 |
7.0.0.293 | 698 | 11/12/2020 |
6.0.0.249 | 817 | 9/16/2020 |
6.0.0.240 | 721 | 9/5/2020 |
5.0.0.231 | 784 | 8/17/2020 |
5.0.0.230 | 771 | 8/12/2020 |
5.0.0.220 | 692 | 8/10/2020 |
4.1.0.202 | 742 | 6/25/2020 |
4.1.0.201 | 738 | 6/25/2020 |
4.1.0.186 | 735 | 6/15/2020 |
4.1.0.177 | 702 | 6/5/2020 |
4.1.0.176 | 695 | 6/5/2020 |
4.1.0.167 | 697 | 5/29/2020 |
4.1.0.166 | 713 | 5/27/2020 |
4.1.0.165 | 768 | 5/25/2020 |
4.0.0.148 | 726 | 4/11/2020 |
4.0.0.108 | 856 | 12/5/2019 |
4.0.0.85 | 719 | 11/30/2019 |
4.0.0.83 | 730 | 11/29/2019 |
3.0.0.49 | 667 | 5/20/2019 |