Skip to content

Commit

Permalink
Add SelectFromWhere method to generate a SELECT * clause with a WHERE…
Browse files Browse the repository at this point in the history
… clause to filter by a specific property value. (#9)
  • Loading branch information
guanghuang authored Dec 9, 2024
1 parent 574e6d1 commit 8aae282
Show file tree
Hide file tree
Showing 4 changed files with 126 additions and 1 deletion.
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -252,6 +252,9 @@ builder.SelectAll<Customer>().RawSql(", count(*) as TotalCount") // append total
- .NET 7.0+

## Version History
- 1.2.3
- Add SelectFromWhere method to generate a SELECT * clause with a WHERE clause to filter by a specific property value.

- 1.2.2
- Fix incorrect alias for snake case name convention.
- Add test project and cases.
Expand Down
22 changes: 22 additions & 0 deletions src/SqlBuilder/SqlBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,15 @@ public SqlBuilder()
_nameConvention = GlobalNameConvention;
}

/// <summary>
/// Creates a new instance of SqlBuilder with default settings from global configuration.
/// </summary>
/// <returns></returns>
public static SqlBuilder Create()
{
return new SqlBuilder();
}

/// <summary>
/// Sets the global naming convention for all SqlBuilder instances.
/// </summary>
Expand Down Expand Up @@ -181,6 +190,19 @@ public SqlBuilder SelectAll<T>(Expression<Func<T, object>>? firstPropertyExpress
return SelectAll(null, firstPropertyExpression, out prefix);
}

/// <summary>
/// Generates a SELECT * clause for a type, with a WHERE clause to filter by a specific property value.
/// </summary>
/// <typeparam name="T">The entity type</typeparam>
/// <typeparam name="TKey">The key type</typeparam>
/// <param name="propertyExpression">Property to place first in the selection</param>
/// <param name="value">The value to compare against</param>
/// <returns>The current SqlBuilder instance for method chaining</returns>
public SqlBuilder SelectFromWhere<T, TKey>(Expression<Func<T, TKey>> propertyExpression, string value)
{
return SelectAll<T>().From<T>().Where(propertyExpression, value);
}

/// <summary>
/// Adds a SELECT * clause for a type.
/// Uses the current naming convention for column formatting and generates a new table prefix.
Expand Down
2 changes: 1 addition & 1 deletion src/SqlBuilder/SqlBuilder.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
<RepositoryUrl>https://github.com/guanghuang/SqlBuilder</RepositoryUrl>
<PackageTags>Query;Sql;SqlBuilder</PackageTags>
<Nullable>enable</Nullable>
<Version>1.2.2</Version>
<Version>1.2.3</Version>
<Copyright>Copyright © 2024 Kvr.SqlBuilder. All rights reserved.</Copyright>
</PropertyGroup>
<ItemGroup>
Expand Down
100 changes: 100 additions & 0 deletions test/SqlBuilder.Tests/SqlBuilderTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -650,4 +650,104 @@ public void SnakeCase_WithCustomerAddressAndComplexJoin_GeneratesCorrectSql()
"ORDER BY kvr1.city ASC",
sql);
}

[Fact]
public void SelectFromWhere_WithIntegerKey_GeneratesCorrectSql()
{
Kvr.SqlBuilder.SqlBuilder.UseGlobalNameConvention(SnakeCaseNameConvention.Create());
// Arrange
var builder = new Kvr.SqlBuilder.SqlBuilder();

// Act
var sql = builder
.SelectFromWhere<Customer, int>(c => c.Id, "1")
.Build();

// Assert
AssertSqlEqual(
"SELECT kvr0.id as Id, kvr0.first_name as FirstName, kvr0.last_name as LastName, kvr0.email as Email " +
"FROM customer kvr0 " +
"WHERE kvr0.id = 1",
sql);
}

[Fact]
public void SelectFromWhere_WithStringKey_GeneratesCorrectSql()
{
Kvr.SqlBuilder.SqlBuilder.UseGlobalNameConvention(SnakeCaseNameConvention.Create());
// Arrange
var builder = new Kvr.SqlBuilder.SqlBuilder();

// Act
var sql = builder
.SelectFromWhere<Customer, string>(c => c.Email, "'[email protected]'")

Check warning on line 683 in test/SqlBuilder.Tests/SqlBuilderTests.cs

View workflow job for this annotation

GitHub Actions / build

Possible null reference return.

Check warning on line 683 in test/SqlBuilder.Tests/SqlBuilderTests.cs

View workflow job for this annotation

GitHub Actions / publish

Possible null reference return.

Check warning on line 683 in test/SqlBuilder.Tests/SqlBuilderTests.cs

View workflow job for this annotation

GitHub Actions / publish

Possible null reference return.
.Build();

// Assert
AssertSqlEqual(
"SELECT kvr0.id as Id, kvr0.first_name as FirstName, kvr0.last_name as LastName, kvr0.email as Email " +
"FROM customer kvr0 " +
"WHERE kvr0.email = '[email protected]'",
sql);
}

[Fact]
public void SelectFromWhere_WithCustomerAddress_GeneratesCorrectSql()
{
Kvr.SqlBuilder.SqlBuilder.UseGlobalNameConvention(SnakeCaseNameConvention.Create());
// Arrange
var builder = new Kvr.SqlBuilder.SqlBuilder();

// Act
var sql = builder
.SelectFromWhere<CustomerAddress, int>(a => a.CustomerId, "1")
.Build();

// Assert
AssertSqlEqual(
"SELECT kvr0.address_id as AddressId, kvr0.customer_id as CustomerId, kvr0.street as Street, kvr0.city as City, kvr0.country as Country, kvr0.postal_code as PostalCode " +
"FROM customer_address kvr0 " +
"WHERE kvr0.customer_id = 1",
sql);
}

[Fact]
public void SelectFromWhere_WithTableAttribute_GeneratesCorrectSql()
{
Kvr.SqlBuilder.SqlBuilder.UseGlobalNameConvention(SnakeCaseNameConvention.Create());
// Arrange
var builder = new Kvr.SqlBuilder.SqlBuilder();

// Act
var sql = builder
.SelectFromWhere<Order, int>(o => o.OrderId, "1")
.Build();

// Assert
AssertSqlEqual(
"SELECT kvr0.order_id as OrderId, kvr0.customer_id as CustomerId, kvr0.amount as Amount, kvr0.order_date as OrderDate " +
"FROM OrderDetails kvr0 " +
"WHERE kvr0.order_id = 1",
sql);
}

[Fact]
public void SelectFromWhere_WithSnakeCase_GeneratesCorrectSql()
{
// Arrange
Kvr.SqlBuilder.SqlBuilder.UseGlobalNameConvention(SnakeCaseNameConvention.Create());
var builder = new Kvr.SqlBuilder.SqlBuilder();

// Act
var sql = builder
.SelectFromWhere<CustomerAddress, string>(a => a.PostalCode, "'12345'")

Check warning on line 743 in test/SqlBuilder.Tests/SqlBuilderTests.cs

View workflow job for this annotation

GitHub Actions / build

Possible null reference return.

Check warning on line 743 in test/SqlBuilder.Tests/SqlBuilderTests.cs

View workflow job for this annotation

GitHub Actions / publish

Possible null reference return.

Check warning on line 743 in test/SqlBuilder.Tests/SqlBuilderTests.cs

View workflow job for this annotation

GitHub Actions / publish

Possible null reference return.
.Build();

// Assert
AssertSqlEqual(
"SELECT kvr0.address_id as AddressId, kvr0.customer_id as CustomerId, kvr0.street as Street, kvr0.city as City, kvr0.country as Country, kvr0.postal_code as PostalCode " +
"FROM customer_address kvr0 " +
"WHERE kvr0.postal_code = '12345'",
sql);
}
}

0 comments on commit 8aae282

Please sign in to comment.