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

Commit 5d30055

Browse files
committed
Added support for selecting all of a table's columns in SqlExpression via .Select<TableA, TableB>((a, b) => new { a })
1 parent fb5d619 commit 5d30055

File tree

5 files changed

+76
-7
lines changed

5 files changed

+76
-7
lines changed

src/ServiceStack.OrmLite.Firebird/FirebirdOrmLiteDialectProvider.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -657,10 +657,10 @@ public override string EscapeWildcards(string value)
657657
.Replace("%", @"^%");
658658
}
659659

660-
public override string GetColumnNames(ModelDefinition modelDef)
660+
public override string GetColumnNames(ModelDefinition modelDef, bool tableQualified = false)
661661
{
662662
if (QuoteNames)
663-
return modelDef.GetColumnNames(this);
663+
return modelDef.GetColumnNames(this); // Calls this.GetColumnNames(modelDef) - infinite loop?
664664

665665
var sqlColumns = StringBuilderCache.Allocate();
666666
foreach (var field in modelDef.FieldDefinitions)

src/ServiceStack.OrmLite/Expressions/SqlExpression.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1465,6 +1465,10 @@ protected virtual object VisitNew(NewExpression nex)
14651465

14661466
protected virtual object VisitParameter(ParameterExpression p)
14671467
{
1468+
var paramModelDef = p.Type.GetModelDefinition();
1469+
if (paramModelDef != null)
1470+
return DialectProvider.GetColumnNames(paramModelDef, true);
1471+
14681472
return p.Name;
14691473
}
14701474

src/ServiceStack.OrmLite/IOrmLiteDialectProvider.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ string ToSelectFromProcedureStatement(object fromObjWithProperties,
159159
ulong FromDbRowVersion(object value);
160160
string GetRowVersionColumnName(FieldDefinition field);
161161

162-
string GetColumnNames(ModelDefinition modelDef);
162+
string GetColumnNames(ModelDefinition modelDef, bool tableQualified = false);
163163

164164
SqlExpression<T> SqlExpression<T>();
165165

src/ServiceStack.OrmLite/OrmLiteDialectProviderBase.cs

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -551,21 +551,32 @@ public virtual string GetRowVersionColumnName(FieldDefinition field)
551551
return GetQuotedColumnName(field.FieldName);
552552
}
553553

554-
public virtual string GetColumnNames(ModelDefinition modelDef)
554+
public virtual string GetColumnNames(ModelDefinition modelDef, bool tableQualified = false)
555555
{
556+
var tablePrefix = "";
557+
if (tableQualified)
558+
{
559+
tablePrefix = GetQuotedTableName(modelDef) + ".";
560+
}
561+
556562
var sqlColumns = StringBuilderCache.Allocate();
557563
foreach (var field in modelDef.FieldDefinitions)
558564
{
559565
if (sqlColumns.Length > 0)
560566
sqlColumns.Append(", ");
561567

562-
if (field.CustomSelect == null)
568+
if (field.CustomSelect != null)
563569
{
564-
sqlColumns.Append(field.GetQuotedName(this));
570+
sqlColumns.Append(field.CustomSelect + " AS " + field.FieldName);
571+
}
572+
else if (field.IsRowVersion)
573+
{
574+
sqlColumns.Append(GetRowVersionColumnName(field));
565575
}
566576
else
567577
{
568-
sqlColumns.Append(field.CustomSelect + " AS " + field.FieldName);
578+
sqlColumns.Append(tablePrefix);
579+
sqlColumns.Append(GetQuotedColumnName(field.FieldName));
569580
}
570581
}
571582

tests/ServiceStack.OrmLite.Tests/Expression/SqlExpressionTests.cs

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -838,5 +838,59 @@ public void Can_select_individual_columns()
838838
Assert.That(result.Extra, Is.Null);
839839
}
840840
}
841+
842+
private class JoinSelectResults1
843+
{
844+
// From TableA
845+
public int Id { get; set; }
846+
public bool Bool { get; set; }
847+
public string Name { get; set; }
848+
849+
// From TableB
850+
public int TableAId { get; set; }
851+
852+
public override bool Equals(object obj)
853+
{
854+
var other = (JoinSelectResults1)obj;
855+
return Id == other.Id && Bool == other.Bool && Name == other.Name && TableAId == other.TableAId;
856+
}
857+
}
858+
859+
[Test]
860+
public void Can_select_entire_tables()
861+
{
862+
using (var db = OpenDbConnection())
863+
{
864+
db.DropAndCreateTable<TableA>();
865+
db.DropAndCreateTable<TableB>();
866+
867+
db.Insert(new TableA { Id = 1, Bool = false, Name = "NameA1" });
868+
db.Insert(new TableA { Id = 2, Bool = true, Name = "NameA2" });
869+
db.Insert(new TableB { Id = 1, TableAId = 1, Name = "NameB1" });
870+
db.Insert(new TableB { Id = 2, TableAId = 2, Name = "NameB2" });
871+
db.Insert(new TableB { Id = 3, TableAId = 2, Name = "NameB3" });
872+
873+
var q = db.From<TableA>()
874+
.Join<TableB>()
875+
.Select<TableA, TableB>((a, b) => new { a, b.TableAId })
876+
.OrderBy(x => x.Id);
877+
878+
try
879+
{
880+
var rows = db.Select<JoinSelectResults1>(q);
881+
var expected = new[]
882+
{
883+
new JoinSelectResults1 { Id = 1, Bool = false, Name = "NameA1", TableAId = 1 },
884+
new JoinSelectResults1 { Id = 2, Bool = true, Name = "NameA2", TableAId = 2 },
885+
new JoinSelectResults1 { Id = 2, Bool = true, Name = "NameA2", TableAId = 2 },
886+
};
887+
Assert.That(rows, Is.EqualTo(expected));
888+
}
889+
finally
890+
{
891+
db.GetLastSql().Print();
892+
}
893+
}
894+
}
841895
}
842896
}

0 commit comments

Comments
 (0)