Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit 1ba40ef

Browse files
committed
Add support for selecting entire table alias fields
1 parent 52f4bf6 commit 1ba40ef

File tree

4 files changed

+188
-119
lines changed

4 files changed

+188
-119
lines changed

src/ServiceStack.OrmLite/Expressions/Sql.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ public static List<object> Flatten(IEnumerable list)
3434

3535
public static bool In<T, TItem>(T value, SqlExpression<TItem> query) => value != null && query != null;
3636

37+
public static string Asc<T>(T value) => value == null ? "" : value + " ASC";
3738
public static string Desc<T>(T value) => value == null ? "" : value + " DESC";
3839

3940
public static string As<T>(T value, object asValue) => value == null ? "" : $"{value} AS {asValue}";

src/ServiceStack.OrmLite/Expressions/SqlExpression.cs

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,6 @@ private SqlExpression<T> InternalSelect(Expression fields, bool distinct=false)
361361
/// <param name='fields'>
362362
/// x=> x.SomeProperty1 or x=> new{ x.SomeProperty1, x.SomeProperty2}
363363
/// </param>
364-
/// </typeparam>
365364
public virtual SqlExpression<T> Select(Expression<Func<T, object>> fields)
366365
{
367366
return InternalSelect(fields);
@@ -1510,10 +1509,7 @@ public string SelectExpression
15101509
BuildSelectExpression(string.Empty, false);
15111510
return selectExpression;
15121511
}
1513-
set
1514-
{
1515-
selectExpression = value;
1516-
}
1512+
set => selectExpression = value;
15171513
}
15181514

15191515
public string FromExpression
@@ -2181,8 +2177,21 @@ private object SetAnonTypePropertyNamesForSelectExpression(object expr, Expressi
21812177
var methodCallExpr = arg as MethodCallExpression;
21822178
var mi = methodCallExpr?.Method;
21832179
var declareType = mi?.DeclaringType;
2184-
if (declareType != null && declareType.Name == "Sql" && mi.Name != "Desc" && mi.Name != "Asc" && mi.Name != "As" && mi.Name != "AllFields")
2185-
return new PartialSqlString(expr + " AS " + member.Name); // new { Alias = Sql.Count("*") }
2180+
if (declareType != null && declareType.Name == nameof(Sql))
2181+
{
2182+
if (mi.Name == nameof(Sql.TableAlias) || mi.Name == nameof(Sql.JoinAlias))
2183+
{
2184+
if (expr is PartialSqlString ps && ps.Text.IndexOf(',') >= 0)
2185+
return ps; // new { buyer = Sql.TableAlias(b, "buyer")
2186+
return new PartialSqlString(expr + " AS " + member.Name); // new { BuyerName = Sql.TableAlias(b.Name, "buyer") }
2187+
}
2188+
2189+
if (mi.Name != nameof(Sql.Desc) && mi.Name != nameof(Sql.Asc) && mi.Name != nameof(Sql.As) && mi.Name != nameof(Sql.AllFields))
2190+
return new PartialSqlString(expr + " AS " + member.Name); // new { Alias = Sql.Count("*") }
2191+
}
2192+
2193+
if (expr is string s && s == Sql.EOT) // new { t1 = Sql.EOT, t2 = "0 EOT" }
2194+
return new PartialSqlString(s);
21862195

21872196
if (arg is ConditionalExpression ce || // new { Alias = x.Value > 1 ? 1 : x.Value }
21882197
arg is BinaryExpression be || // new { Alias = x.First + " " + x.Last }
@@ -2194,7 +2203,7 @@ private object SetAnonTypePropertyNamesForSelectExpression(object expr, Expressi
21942203
? converter.ToQuotedString(expr.GetType(), expr)
21952204
: expr.ToString();
21962205

2197-
return new PartialSqlString(OrmLiteUtils.UnquotedColumnName(strExpr) != member.Name
2206+
return new PartialSqlString(OrmLiteUtils.UnquotedColumnName(strExpr) != member.Name
21982207
? strExpr + " AS " + member.Name
21992208
: strExpr);
22002209
}
@@ -2835,6 +2844,9 @@ protected virtual object VisitSqlMethodCall(MethodCallExpression m)
28352844
case nameof(Sql.In):
28362845
statement = ConvertInExpressionToSql(m, quotedColName);
28372846
break;
2847+
case nameof(Sql.Asc):
2848+
statement = $"{quotedColName} ASC";
2849+
break;
28382850
case nameof(Sql.Desc):
28392851
statement = $"{quotedColName} DESC";
28402852
break;
@@ -2860,7 +2872,16 @@ protected virtual object VisitSqlMethodCall(MethodCallExpression m)
28602872
break;
28612873
case nameof(Sql.JoinAlias):
28622874
case nameof(Sql.TableAlias):
2863-
statement = args[0] + "." + quotedColName.ToString().LastRightPart('.');
2875+
if (quotedColName is SelectList && m.Arguments.Count == 2 && m.Arguments[0] is ParameterExpression p)
2876+
{
2877+
var paramModelDef = p.Type.GetModelDefinition();
2878+
var alias = Visit(m.Arguments[1]).ToString();
2879+
statement = new SelectList(DialectProvider.GetColumnNames(paramModelDef, alias)).ToString();
2880+
}
2881+
else
2882+
{
2883+
statement = args[0] + "." + quotedColName.ToString().LastRightPart('.');
2884+
}
28642885
break;
28652886
case nameof(Sql.Custom):
28662887
statement = quotedColName.ToString();

src/ServiceStack.OrmLite/OrmLiteUtils.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,13 +311,19 @@ internal static List<Tuple<FieldDefinition, int, IOrmLiteConverter>[]> GetMultiI
311311
if (string.Equals("EOT", reader.GetName(endPos), StringComparison.OrdinalIgnoreCase))
312312
break;
313313
}
314+
315+
var noEOT = endPos == reader.FieldCount; // If no explicit EOT delimiter, split by field count
316+
if (genericArgs.Length > 0 && noEOT)
317+
{
318+
endPos = startPos + modelDef.FieldDefinitionsArray.Length;
319+
}
314320

315321
var indexCache = reader.GetIndexFieldsCache(modelDef, dialectProvider, onlyFields,
316322
startPos: startPos, endPos: endPos);
317323

318324
modelIndexCaches.Add(indexCache);
319325

320-
startPos = endPos + 1;
326+
startPos = noEOT ? endPos : endPos + 1;
321327
}
322328
return modelIndexCaches;
323329
}

0 commit comments

Comments
 (0)