Package to generate SQL queries. Group by, COUNT, AVG, MAX, MIN, ORDER BY, and more. This package is only responsible for generating the select command, it does not intermediate the execution of the query. The idea is not to replace an ORM framework, just to support applications that cannot use
Package on nuget: FluentSqlBuilder.Core.
For the examples consider the classes below
To define the correct name of the table in the database, use the DataAnnotations classes: "System.ComponentModel.DataAnnotations.Schema.TableAttribute" and "System.ComponentModel.DataAnnotations.Schema.ColumnAttribute"
[Table("order", Schema = "checkout")]
public class OrderDataModel
{
public int Id { get; set; }
[Column("customer_id")]
public int CustomerId { get; set; }
public OrderStatus Status { get; set; }
}
[Table("customer", Schema = "customers")]
public class CustomerDataModel
{
public int Id { get; set; }
public string Name { get; set; }
public CustomerType Type { get; set; }
}
var sqlBuilder = new FluentSqlBuilder<OrderDataModel>(SqlAdapterType.SqlServer2019, SqlBuilderFormatting.Indented);
output
SELECT [order].[Id],
[order].[customer_id] AS CustomerId,
[order].[Status]
FROM [checkout].[order]
var sqlBuilder = new FluentSqlBuilder<OrderDataModel>(SqlAdapterType.SqlServer2019, SqlBuilderFormatting.Indented)
.InnerJoin<CustomerDataModel>((order, customer) => order.CustomerId == customer.Id);
output
SELECT [order].[Id],
[order].[customer_id] AS CustomerId,
[order].[Status]
FROM [checkout].[order]
INNER JOIN [customer] ON ([order].[customer_id] = [customer].[Id])
var sqlBuilder = new FluentSqlBuilder<OrderDataModel>(SqlAdapterType.SqlServer2019, SqlBuilderFormatting.Indented)
.LeftJoin<CustomerDataModel>((order, customer) => order.CustomerId == customer.Id);
output
SELECT [order].[Id],
[order].[customer_id] AS CustomerId,
[order].[Status]
FROM [checkout].[order]
LEFT JOIN [customer] ON ([order].[customer_id] = [customer].[Id])
var sqlBuilder = new FluentSqlBuilder<OrderDataModel>(SqlAdapterType.SqlServer2019, SqlBuilderFormatting.Indented)
.RightJoin<CustomerDataModel>((order, customer) => order.CustomerId == customer.Id);
output
SELECT [order].[Id],
[order].[customer_id] AS CustomerId,
[order].[Status]
FROM [checkout].[order]
RIGHT JOIN [customer] ON ([order].[customer_id] = [customer].[Id])
var sqlBuilder = new FluentSqlBuilder<OrderDataModel>(SqlAdapterType.SqlServer2019, SqlBuilderFormatting.Indented)
.Where(x => x.Status == OrderStatus.Paid && x.CustomerId == 1);
output
SELECT [order].[Id],
[order].[customer_id] AS CustomerId,
[order].[Status]
FROM [checkout].[order] WHERE ([order].[Status] = @Param1
AND [order].[customer_id] = @Param2)
var sqlBuilder = new FluentSqlBuilder<OrderDataModel>(SqlAdapterType.SqlServer2019, SqlBuilderFormatting.Indented)
.Where(x => x.Status == OrderStatus.Paid && x.CustomerId == 1);
output
SELECT [order].[Id],
[order].[customer_id] AS CustomerId,
[order].[Status]
FROM [checkout].[order]
INNER JOIN [customer] ON ([order].[customer_id] = [customer].[Id])
WHERE ([order].[Status] = @Param1
AND [order].[customer_id] = @Param2)
AND [customer].[Type] = @Param3
var sqlBuilder = new FluentSqlBuilder<OrderDataModel>(SqlAdapterType.SqlServer2019, SqlBuilderFormatting.Indented)
.OrderBy(x => x.CustomerId);
output
SELECT [order].[Id],
[order].[customer_id] AS CustomerId,
[order].[Status]
FROM [checkout].[order]
ORDER BY [order].[customer_id] ASC
var sqlBuilder = new FluentSqlBuilder<OrderDataModel>(SqlAdapterType.SqlServer2019, SqlBuilderFormatting.Indented)
.OrderByDescending(x => x.CustomerId);
output
SELECT [order].[Id],
[order].[customer_id] AS CustomerId,
[order].[Status]
FROM [checkout].[order] ORDER BY [order].[customer_id] DESC
var sqlBuilder = new FluentSqlBuilder<OrderDataModel>(SqlAdapterType.SqlServer2019, SqlBuilderFormatting.Indented)
.Min(x => x.CustomerId)
.GroupBy(x => x.CustomerId);
output
SELECT MIN([order].[customer_id])
FROM [checkout].[order]
GROUP BY [order].[customer_id]
var sqlBuilder = new FluentSqlBuilder<OrderDataModel>(SqlAdapterType.SqlServer2019, SqlBuilderFormatting.Indented)
.Min(x => x.CustomerId)
.GroupBy(x => x.CustomerId);
output
SELECT MIN([order].[customer_id])
FROM [checkout].[order]
GROUP BY [order].[customer_id]
HAVING MIN([order].[customer_id]) > @Param1
var sqlBuilder = new FluentSqlBuilder<OrderDataModel>(SqlAdapterType.SqlServer2019, SqlBuilderFormatting.Indented)
.Projection(x => new { x.Id, x.Status });
output
SELECT [order].[Id],
[order].[Status]
FROM [checkout].[order]
var sqlBuilder = new FluentSqlBuilder<OrderDataModel>(SqlAdapterType.SqlServer2019, SqlBuilderFormatting.Indented)
.Limit(10);
output
SELECT TOP(10) [order].[Id],
[order].[customer_id] AS CustomerId,
[order].[Status]
FROM [checkout].[order]
var sqlBuilder = new FluentSqlBuilder<OrderDataModel>(SqlAdapterType.SqlServer2019, SqlBuilderFormatting.Indented)
.Limit(10);
output
SELECT [order].[Id],
[order].[customer_id] AS CustomerId,
[order].[Status]
FROM [checkout].[order]
ORDER BY [order].[Id] ASC
OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY
var sqlBuilder = new FluentSqlBuilder<OrderDataModel>(SqlAdapterType.SqlServer2019, SqlBuilderFormatting.Indented, "order_alias");
output
SELECT [order_alias].[Id],
[order_alias].[customer_id] AS CustomerId,
[order_alias].[Status]
FROM [checkout].[order_alias] AS order_alias
var sqlBuilder = new FluentSqlBuilder<OrderDataModel>(SqlAdapterType.SqlServer2019, SqlBuilderFormatting.Indented, "order_alias");
output
SELECT TOP(10) [order_alias].[customer_id] AS CustomerId,
[customer_alias].[Id],
[customer_alias].[customer_id] AS CustomerId,
[customer_alias].[Status]
FROM [checkout].[order_alias] AS order_alias
INNER JOIN [customer] AS customer_alias ON ([order_alias].[customer_id] = [customer_alias].[Id])
WHERE ([order_alias].[Status] = @Param1
AND [order_alias].[customer_id] = @Param2)
ORDER BY [order_alias].[Id] ASC