From d840e73fe9bb1d5cb41b85bc4edff7cd97b41457 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20G=C3=A4vert?= Date: Wed, 14 May 2025 16:11:23 +0200 Subject: [PATCH] Fix issue with Include not selecting ComplexMapping columns Fixes schotime/NPoco#645 --- src/NPoco/Linq/ComplexSqlBuilder.cs | 33 +++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/src/NPoco/Linq/ComplexSqlBuilder.cs b/src/NPoco/Linq/ComplexSqlBuilder.cs index 6a633704..61677dd1 100644 --- a/src/NPoco/Linq/ComplexSqlBuilder.cs +++ b/src/NPoco/Linq/ComplexSqlBuilder.cs @@ -113,6 +113,27 @@ public Sql BuildJoin(IDatabase database, SqlExpression sqlExpression, List GetJoinPocoColumns(IEnumerable members) + { + foreach (var member in members) + { + switch (member.ReferenceType) + { + case ReferenceType.Foreign: + break; + case ReferenceType.None: + { + yield return member.PocoColumn; + foreach (var pocoMemberChild in GetJoinPocoColumns(member.PocoMemberChildren)) + { + yield return pocoMemberChild; + } + break; + } + } + } + } + private static string BuildJoinSql(IDatabase database, List joinSqlExpressions, ref List cols) { var joins = new List(); @@ -121,14 +142,14 @@ private static string BuildJoinSql(IDatabase database, List joinSqlExp { var member = joinSqlExpression.PocoMemberJoin; - cols = cols.Concat(joinSqlExpression.PocoMembers - .Where(x => x.ReferenceType == ReferenceType.None && x.PocoColumn != null && !x.PocoColumn.ResultColumn) + cols = cols.Concat(GetJoinPocoColumns(joinSqlExpression.PocoMembers) + .Where(x => x != null && !x.ResultColumn) .Select(x => new StringPocoCol { - StringCol = database.DatabaseType.EscapeTableName(x.PocoColumn.TableInfo.AutoAlias) - + "." + database.DatabaseType.EscapeSqlIdentifier(x.PocoColumn.ColumnName) + " as " + database.DatabaseType.EscapeSqlIdentifier(x.PocoColumn.MemberInfoKey), - PocoColumn = new[] { x.PocoColumn } - })).ToList(); + StringCol = database.DatabaseType.EscapeTableName(x.TableInfo.AutoAlias) + + "." + database.DatabaseType.EscapeSqlIdentifier(x.ColumnName) + " as " + database.DatabaseType.EscapeSqlIdentifier(x.MemberInfoKey), + PocoColumn = new[] { x } + })).ToList(); joins.Add(string.Format(" {0} JOIN " + database.DatabaseType.EscapeTableName(member.PocoColumn.TableInfo.TableName) + " " + database.DatabaseType.EscapeTableName(member.PocoColumn.TableInfo.AutoAlias) + joinSqlExpression.Hint + " ON " + joinSqlExpression.OnSql, joinSqlExpression.JoinType == JoinType.Inner ? "INNER" : "LEFT")); }