{"id":21243318,"url":"https://github.com/loresoft/fluentcommand","last_synced_at":"2026-04-30T03:04:43.741Z","repository":{"id":5104978,"uuid":"6268710","full_name":"loresoft/FluentCommand","owner":"loresoft","description":"Fluent Wrapper for DbCommand","archived":false,"fork":false,"pushed_at":"2025-04-02T08:03:55.000Z","size":4660,"stargazers_count":20,"open_issues_count":0,"forks_count":8,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-04-06T09:09:16.952Z","etag":null,"topics":["database","db","dbcommand","dbconnection","postgresql","sql-server","sqlite"],"latest_commit_sha":null,"homepage":"https://loresoft.com/FluentCommand/","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"js-data/js-data","license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/loresoft.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"loresoft"}},"created_at":"2012-10-17T21:07:01.000Z","updated_at":"2025-04-02T08:03:53.000Z","dependencies_parsed_at":"2023-02-16T22:31:42.222Z","dependency_job_id":"ff7044e7-df96-4be9-adca-70e196c64bc6","html_url":"https://github.com/loresoft/FluentCommand","commit_stats":{"total_commits":194,"total_committers":7,"mean_commits":"27.714285714285715","dds":0.2628865979381443,"last_synced_commit":"f59596bc4a33fd83332b60e86c4072b65601defb"},"previous_names":[],"tags_count":35,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/loresoft%2FFluentCommand","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/loresoft%2FFluentCommand/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/loresoft%2FFluentCommand/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/loresoft%2FFluentCommand/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/loresoft","download_url":"https://codeload.github.com/loresoft/FluentCommand/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247457803,"owners_count":20941906,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["database","db","dbcommand","dbconnection","postgresql","sql-server","sqlite"],"created_at":"2024-11-21T01:11:45.254Z","updated_at":"2026-04-01T18:19:04.791Z","avatar_url":"https://github.com/loresoft.png","language":"C#","readme":"# FluentCommand\n\nFluent Wrapper for DbCommand.\n\n[![Build status](https://github.com/loresoft/FluentCommand/workflows/Build/badge.svg)](https://github.com/loresoft/FluentCommand/actions)\n\n[![Coverage Status](https://coveralls.io/repos/github/loresoft/FluentCommand/badge.svg?branch=master)](https://coveralls.io/github/loresoft/FluentCommand?branch=master)\n\n| Package                                                                            | Version                                                                                                                                           |\n| :--------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------ |\n| [FluentCommand](https://www.nuget.org/packages/FluentCommand/)                     | [![FluentCommand](https://img.shields.io/nuget/v/FluentCommand.svg)](https://www.nuget.org/packages/FluentCommand/)                               |\n| [FluentCommand.SqlServer](https://www.nuget.org/packages/FluentCommand.SqlServer/) | [![FluentCommand.SqlServer](https://img.shields.io/nuget/v/FluentCommand.SqlServer.svg)](https://www.nuget.org/packages/FluentCommand.SqlServer/) |\n| [FluentCommand.Json](https://www.nuget.org/packages/FluentCommand.Json/)           | [![FluentCommand.Json](https://img.shields.io/nuget/v/FluentCommand.Json.svg)](https://www.nuget.org/packages/FluentCommand.Json/)                |\n\n## Download\n\nThe FluentCommand library is available on nuget.org via package name `FluentCommand`.\n\nTo install FluentCommand, run the following command in the Package Manager Console\n\n    PM\u003e Install-Package FluentCommand\n\nMore information about NuGet package available at\n\u003chttps://nuget.org/packages/FluentCommand\u003e\n\n## Features\n\n- Fluent wrapper over DbConnection and DbCommand\n- Callback for parameter return values\n- Automatic handling of connection state\n- Caching of results\n- Automatic creating of entity from DataReader via Dapper\n- Create Dynamic objects from DataReader via Dapper\n- Handles multiple result sets\n- Basic SQL query builder\n- Source Generate DataReader\n\n### Configuration\n\nConfiguration for SQL Server\n\n```c#\nIDataConfiguration dataConfiguration  = new DataConfiguration(\n    SqlClientFactory.Instance, \n    ConnectionString\n);\n```\n\nRegister with dependency injection\n\n```c#\nservices.AddFluentCommand(builder =\u003e builder\n    .UseConnectionString(ConnectionString)\n    .UseSqlServer()\n);\n```\n\nRegister using a connection name from the appsettings.json\n\n```c#\nservices.AddFluentCommand(builder =\u003e builder\n    .UseConnectionName(\"Tracker\")\n    .UseSqlServer()\n);\n```\n\n```json\n{\n  \"ConnectionStrings\": {\n    \"Tracker\": \"Data Source=(local);Initial Catalog=TrackerTest;Integrated Security=True;TrustServerCertificate=True;\"\n  }\n}\n```\n\nRegister for PostgreSQL\n\n```c#\nservices.AddFluentCommand(builder =\u003e builder\n    .UseConnectionName(\"Tracker\")\n    .AddProviderFactory(NpgsqlFactory.Instance)\n    .AddPostgreSqlGenerator()\n);\n```\n\n### Example\n\nQuery all users with email domain.  Entity is automatically created from DataReader.\n\n```c#\nstring email = \"%@battlestar.com\";\nstring sql = \"select * from [User] where EmailAddress like @EmailAddress\";\n\nvar session = configuration.CreateSession();\nvar user = await session\n    .Sql(sql)\n    .Parameter(\"@EmailAddress\", email)\n    .QuerySingleAsync(r =\u003e new User\n    {\n        Id = r.GetGuid(\"Id\"),\n        EmailAddress = r.GetString(\"EmailAddress\"),\n        IsEmailAddressConfirmed = r.GetBoolean(\"IsEmailAddressConfirmed\"),\n        DisplayName = r.GetString(\"DisplayName\"),\n        PasswordHash = r.GetString(\"PasswordHash\"),\n        ResetHash = r.GetString(\"ResetHash\"),\n        InviteHash = r.GetString(\"InviteHash\"),\n        AccessFailedCount = r.GetInt32(\"AccessFailedCount\"),\n        LockoutEnabled = r.GetBoolean(\"LockoutEnabled\"),\n        LockoutEnd = r.GetDateTimeOffsetNull(\"LockoutEnd\"),\n        LastLogin = r.GetDateTimeOffsetNull(\"LastLogin\"),\n        IsDeleted = r.GetBoolean(\"IsDeleted\"),\n        Created = r.GetDateTimeOffset(\"Created\"),\n        CreatedBy = r.GetString(\"CreatedBy\"),\n        Updated = r.GetDateTimeOffset(\"Updated\"),\n        UpdatedBy = r.GetString(\"UpdatedBy\"),\n        RowVersion = r.GetBytes(\"RowVersion\"),\n    });\n```\n\nExecute a stored procedure with out parameters\n\n```c#\nGuid userId = Guid.Empty;\nint errorCode = -1;\n\nvar username = \"test.\" + DateTime.Now.Ticks;\nvar email = username + \"@email.com\";\n\nvar session = configuration.CreateSession();\nvar result = session\n    .StoredProcedure(\"[dbo].[aspnet_Membership_CreateUser]\")\n    .Parameter(\"@ApplicationName\", \"/\")\n    .Parameter(\"@UserName\", username)\n    .Parameter(\"@Password\", \"T@est\" + DateTime.Now.Ticks)\n    .Parameter(\"@Email\", email)\n    .Parameter(\"@PasswordSalt\", \"test salt\")\n    .Parameter\u003cstring\u003e(\"@PasswordQuestion\", null)\n    .Parameter\u003cstring\u003e(\"@PasswordAnswer\", null)\n    .Parameter(\"@IsApproved\", true)\n    .Parameter(\"@CurrentTimeUtc\", DateTime.UtcNow)\n    .Parameter(\"@UniqueEmail\", 1)\n    .Parameter(\"@PasswordFormat\", 1)\n    .ParameterOut\u003cGuid\u003e(\"@UserId\", p =\u003e userId = p)\n    .Return\u003cint\u003e(p =\u003e errorCode = p)\n    .Execute();\n```\n\nQuery for user by email address.  Also return Role and Status entities.\n\n```c#\nstring email = \"kara.thrace@battlestar.com\";\nstring sql = \"select * from [User] where EmailAddress = @EmailAddress; \" +\n             \"select * from [Status]; \" +\n             \"select * from [Priority]; \";\n\nUser user = null;\nList\u003cStatus\u003e status = null;\nList\u003cPriority\u003e priorities = null;\n\nvar session = configuration.CreateSession();\nsession\n    .Sql(sql)\n    .Parameter(\"@EmailAddress\", email)\n    .QueryMultiple(q =\u003e\n    {\n        user = q.QuerySingle\u003cUser\u003e();\n        status = q.Query\u003cStatus\u003e().ToList();\n        priorities = q.Query\u003cPriority\u003e().ToList();\n    });\n```\n\n## Query Builder\n\nBuild SQL statements with the query builder.  Query builder uses the DataAnnotations Schema attributes to extract table and column information.\n\n```c#\nvar session = configuration.CreateSession();\n\nstring email = \"kara.thrace@battlestar.com\";\n\nvar user = await session\n    .Sql(builder =\u003e builder\n        .Select\u003cUser\u003e() // table name comes from type\n        .Where(p =\u003e p.EmailAddress, email)\n    )\n    .QuerySingleAsync\u003cUser\u003e();\n```\n\nCount query\n\n```c#\nstring email = \"kara.thrace@battlestar.com\";\n\nvar count = await session\n    .Sql(builder =\u003e builder\n        .Select\u003cUser\u003e()\n        .Count()\n        .Where(p =\u003e p.EmailAddress, email)\n    )\n    .QueryValueAsync\u003cint\u003e();\n\n```\n\nInsert statement\n\n```c#\nvar id = Guid.NewGuid();\n\nvar userId = await session\n    .Sql(builder =\u003e builder\n        .Insert\u003cUser\u003e()\n        .Value(p =\u003e p.Id, id)\n        .Value(p =\u003e p.EmailAddress, $\"{id}@email.com\")\n        .Value(p =\u003e p.DisplayName, \"Last, First\")\n        .Value(p =\u003e p.FirstName, \"First\")\n        .Value(p =\u003e p.LastName, \"Last\")\n        .Output(p =\u003e p.Id) // return key as output value\n        .Tag() // add comment tag to query\n    )\n    .QueryValueAsync\u003cGuid\u003e();\n```\n\nUpdate statement\n\n```c#\nvar updateId = await session\n    .Sql(builder =\u003e builder\n        .Update\u003cUser\u003e()\n        .Value(p =\u003e p.DisplayName, \"Updated Name\")\n        .Output(p =\u003e p.Id)\n        .Where(p =\u003e p.Id, id)\n        .Tag()\n    )\n    .QueryValueAsync\u003cGuid\u003e();\n```\n\nDelete statement\n\n```c#\nvar deleteId = await session\n    .Sql(builder =\u003e builder\n        .Delete\u003cUser\u003e()\n        .Output(p =\u003e p.Id)\n        .Where(p =\u003e p.Id, id)\n        .Tag()\n    )\n    .QueryValueAsync\u003cGuid\u003e();\n```\n\n### Source Generator\n\nThe project supports generating a DbDataReader from a class via an attribute.  Add the `TableAttribute` to a class to generate the needed extension methods.\n\n```c#\n[Table(\"Status\", Schema = \"dbo\")]\npublic class Status\n{\n    public int Id { get; set; }\n    public string Name { get; set; }\n    public string Description { get; set; }\n    public int DisplayOrder { get; set; }\n    public bool IsActive { get; set; }\n    public DateTimeOffset Created { get; set; }\n    public string CreatedBy { get; set; }\n    public DateTimeOffset Updated { get; set; }\n    public string UpdatedBy { get; set; }\n\n    [ConcurrencyCheck]\n    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]\n    [DataFieldConverter(typeof(ConcurrencyTokenHandler))]\n    public ConcurrencyToken RowVersion { get; set; }\n\n    [NotMapped]\n    public virtual ICollection\u003cTask\u003e Tasks { get; set; } = new List\u003cTask\u003e();\n}\n```\n\nExtension methods are generated to materialize data command to entities\n\n```c#\nstring email = \"kara.thrace@battlestar.com\";\nstring sql = \"select * from [User] where EmailAddress = @EmailAddress\";\nvar session = configuration.CreateSession();\nvar user = await session\n    .Sql(sql)\n    .Parameter(\"@EmailAddress\", email)\n    .QuerySingleAsync\u003cUser\u003e();\n```\n\n\n## SQL Server Features\n\n    PM\u003e Install-Package FluentCommand.SqlServer\n\n### Bulk Copy\n\nUsing SQL Server bulk copy feature to import a lot of data.\n\n```c#\nusing (var session = configuration.CreateSession())\n{\n    session.BulkCopy(\"[User]\")\n        .AutoMap()\n        .Ignore(\"RowVersion\")\n        .WriteToServer(users);\n}\n```\n\n### Merge Data\n\nGenerate and merge data into a table\n\n```c#\nvar users = generator.List\u003cUserImport\u003e(100);\n\nint rows;\nusing (var session = configuration.CreateSession())\n{\n    rows = session\n        .MergeData(\"dbo.User\")\n        .Map\u003cUserImport\u003e(m =\u003e m\n            .AutoMap()\n            .Column(p =\u003e p.EmailAddress).Key()\n        )\n        .Execute(users);\n}\n```\n","funding_links":["https://github.com/sponsors/loresoft"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Floresoft%2Ffluentcommand","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Floresoft%2Ffluentcommand","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Floresoft%2Ffluentcommand/lists"}