Skip to content

Commit c74b40f

Browse files
committed
#56 when selector returnType is class find the dbTableExpression from the queries table list and set the column declarations
1 parent 79eacc0 commit c74b40f

File tree

2 files changed

+48
-1
lines changed

2 files changed

+48
-1
lines changed

SubSonic.Core.DataAccessLayer/src/Builders/DbSqlQueryBuilder/DbSqlQueryBuilderBuildMethods.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -624,7 +624,16 @@ private Expression BuildSelectWithExpression(MethodCallExpression expression)
624624
switch (selector.Body.NodeType)
625625
{
626626
case ExpressionType.MemberAccess:
627-
columns = select.Columns.Where(column => column.PropertyName.Equals(selector.GetProperty().Name, StringComparison.CurrentCulture));
627+
if (selector.ReturnType.IsClass)
628+
{
629+
DbTableExpression dbTable = select.From.ToTableList().Single(x => x.Type.GenericTypeArguments[0] == selector.ReturnType);
630+
631+
columns = dbTable.Columns;
632+
}
633+
else
634+
{
635+
columns = select.Columns.Where(column => column.PropertyName.Equals(selector.GetProperty().Name, StringComparison.CurrentCulture));
636+
}
628637
break;
629638
case ExpressionType.MemberInit:
630639
columns = BuildColumnDeclarationList(selector.Body, select);

SubSonic.Tests/DAL/SqlQueryProvider/SqlGeneratorTests.cs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1092,5 +1092,43 @@ INNER JOIN page
10921092

10931093
query.Sql.Should().Be(expected);
10941094
}
1095+
1096+
[Test]
1097+
public void CanGenerateSelectStatementForIncludedEntity()
1098+
{
1099+
string expected = @"SELECT [T1].[ID], [T1].[Bedrooms] AS [NumberOfBedrooms], [T1].[StatusID], [T1].[RealEstatePropertyID]
1100+
FROM [dbo].[Renter] AS [T2]
1101+
INNER JOIN [dbo].[Unit] AS [T1]
1102+
ON ([T1].[ID] = [T2].[UnitID])
1103+
WHERE (([T2].[PersonID] = @personid_1) AND @dt_value_2 BETWEEN [T2].[StartDate] AND COALESCE([T2].[EndDate], @dt_value_3))";
1104+
1105+
Person person = Context.People.First();
1106+
1107+
Expression select = person
1108+
.Renters
1109+
.Where((Renter) =>
1110+
DateTime.Today.Between(Renter.StartDate, Renter.EndDate.GetValueOrDefault(DateTime.Today.AddDays(1))))
1111+
.Include(x => x.Unit)
1112+
.Select(x => x.Unit)
1113+
.Expression;
1114+
1115+
IDbQuery query = null;
1116+
1117+
var logging = Context.Instance.GetService<ISubSonicLogger<DbSelectPageExpression>>();
1118+
1119+
using (var perf = logging.Start("SQL Query Writer"))
1120+
{
1121+
FluentActions.Invoking(() =>
1122+
{
1123+
ISubSonicQueryProvider<Status> builder = Context.Instance.GetService<ISubSonicQueryProvider<Status>>();
1124+
1125+
query = builder.ToQuery(select);
1126+
}).Should().NotThrow();
1127+
}
1128+
1129+
query.Sql.Should().NotBeNullOrEmpty();
1130+
1131+
query.Sql.Should().Be(expected);
1132+
}
10951133
}
10961134
}

0 commit comments

Comments
 (0)