From 47d63be64d275070eeb15d6edb3fb8fe843d14f2 Mon Sep 17 00:00:00 2001 From: Harish Date: Wed, 17 Dec 2025 22:39:39 +0700 Subject: [PATCH 1/2] add select by type --- QueryBuilder.Tests/SelectTests.cs | 30 ++++++++++++++++++++++++++++++ QueryBuilder/Query.Select.cs | 20 ++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/QueryBuilder.Tests/SelectTests.cs b/QueryBuilder.Tests/SelectTests.cs index 647187b9..fdc1885c 100644 --- a/QueryBuilder.Tests/SelectTests.cs +++ b/QueryBuilder.Tests/SelectTests.cs @@ -958,5 +958,35 @@ public void SelectWithExists_OmitSelectIsFalse() Assert.Equal("SELECT * FROM [Posts] WHERE EXISTS (SELECT [Id] FROM [Comments] WHERE [Comments].[PostId] = [Posts].[Id])", sqlServer.ToString()); } + public record Post(int Id, string Title, DateTime Published); + + [Fact] + public void SelectType() { + var q = new Query("Post").Select(); + + var pgsql = Compilers.CompileFor(EngineCodes.PostgreSql, q); + + Assert.Equal(""" + SELECT "Id", "Title", "Published" FROM "Post" + """, pgsql.ToString()); + } + + public class Comment { + [Column("comment_id")] public int Id { get; set; } + [Column("post_id")] public int PostId { get; set; } + [Column("content")] public string Content { get; set; } + [Column("created_at")] public DateTime Created { get; set; } + } + + [Fact] + public void SelectType_WithColumnAttribute() { + var q = new Query("Comment").Select(); + + var pgsql = Compilers.CompileFor(EngineCodes.PostgreSql, q); + + Assert.Equal(""" + SELECT "comment_id" AS "Id", "post_id" AS "PostId", "content" AS "Content", "created_at" AS "Created" FROM "Comment" + """, pgsql.ToString()); + } } } diff --git a/QueryBuilder/Query.Select.cs b/QueryBuilder/Query.Select.cs index 9502c024..00eabbb4 100644 --- a/QueryBuilder/Query.Select.cs +++ b/QueryBuilder/Query.Select.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Reflection; namespace SqlKata { @@ -117,5 +118,24 @@ public Query SelectMax(string column, Func filter = null) { return SelectAggregate("max", column, filter); } + + public Query Select() { + var properties = typeof(T).GetProperties(); + var columns = new List(); + foreach (var property in properties) { + if (property.GetSetMethod() == null) { + continue; + } + + var name = property.Name; + var attribute = property.GetCustomAttribute(); + if (attribute != null) { + name = $"{attribute.Name} as {name}"; + } + + columns.Add(name); + } + return Select(columns); + } } } From f133fb9d230a5a48b28cb8d5652a7267c69ebee8 Mon Sep 17 00:00:00 2001 From: Harish Date: Wed, 17 Dec 2025 22:57:02 +0700 Subject: [PATCH 2/2] add type constraint --- QueryBuilder/Query.Select.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/QueryBuilder/Query.Select.cs b/QueryBuilder/Query.Select.cs index 00eabbb4..26eef39a 100644 --- a/QueryBuilder/Query.Select.cs +++ b/QueryBuilder/Query.Select.cs @@ -119,7 +119,7 @@ public Query SelectMax(string column, Func filter = null) return SelectAggregate("max", column, filter); } - public Query Select() { + public Query Select() where T : class { var properties = typeof(T).GetProperties(); var columns = new List(); foreach (var property in properties) {