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..26eef39a 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() where T : class { + 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); + } } }