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

Commit 259c7ce

Browse files
committed
Merge pull request #440 from ServiceStack/load_select_join_fix
LoadSelect fails with column name conflict on join
2 parents 388b8c2 + e1319ab commit 259c7ce

File tree

2 files changed

+100
-1
lines changed

2 files changed

+100
-1
lines changed

src/ServiceStack.OrmLite/Support/LoadList.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Collections.Generic;
44
using System.Data;
55
using System.Linq;
6+
using System.Text;
67
using System.Threading;
78
using System.Threading.Tasks;
89

@@ -89,7 +90,11 @@ protected void SetListChildResults(FieldDefinition fieldDef, Type refType, IList
8990
protected string GetRefSelfSql(FieldDefinition refSelf, ModelDefinition refModelDef)
9091
{
9192
//Load Self Table.RefTableId PK
92-
expr.Select(dialectProvider.GetQuotedColumnName(refSelf));
93+
StringBuilder sbSelect = new StringBuilder();
94+
sbSelect.AppendFormat("{0}.{1}",
95+
dialectProvider.GetQuotedTableName(refModelDef),
96+
refSelf.GetQuotedName(dialectProvider));
97+
expr.Select(sbSelect.ToString());
9398
var subSqlRef = expr.ToSelectStatement();
9499

95100
var sqlRef = "SELECT {0} FROM {1} WHERE {2} IN ({3})".Fmt(

tests/ServiceStack.OrmLite.Tests/LoadReferencesJoinTests.cs

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -627,6 +627,69 @@ public void Can_load_references_with_OrderBy()
627627
Assert.That(orders.Count, Is.EqualTo(6));
628628
}
629629

630+
[Test]
631+
public void Can_load_select_with_join()
632+
{
633+
// Drop tables in order that FK allows
634+
db.DropTable<TABLE_3>();
635+
db.DropTable<TABLE_2>();
636+
db.DropTable<TABLE_1>();
637+
db.CreateTable<TABLE_1>();
638+
db.CreateTable<TABLE_2>();
639+
db.CreateTable<TABLE_3>();
640+
641+
var id1 = db.Insert(new TABLE_1 { One = "A" }, selectIdentity: true);
642+
var id2 = db.Insert(new TABLE_1 { One = "B" }, selectIdentity: true);
643+
644+
db.Insert(new TABLE_2 { Three = "C", TableOneKey = (int)id1 });
645+
646+
var q = db.From<TABLE_1>()
647+
.Join<TABLE_2>();
648+
var results = db.LoadSelect(q);
649+
650+
Assert.That(results.Count, Is.EqualTo(1));
651+
Assert.That(results[0].One, Is.EqualTo("A"));
652+
653+
var row3 = new TABLE_3
654+
{
655+
Three = "3a",
656+
TableTwo = new TABLE_2
657+
{
658+
Three = "3b",
659+
TableOneKey = (int)id1,
660+
}
661+
};
662+
db.Save(row3, references: true);
663+
664+
Assert.That(row3.TableTwoKey, Is.EqualTo(row3.TableTwo.Id));
665+
666+
row3 = db.LoadSingleById<TABLE_3>(row3.Id);
667+
Assert.That(row3.TableTwoKey, Is.EqualTo(row3.TableTwo.Id));
668+
}
669+
670+
[Test]
671+
public void Can_load_select_with_join_and_same_name_columns()
672+
{
673+
// Drop tables in order that FK allows
674+
db.DropTable<ProjectTask>();
675+
db.DropTable<Project>();
676+
db.CreateTable<Project>();
677+
db.CreateTable<ProjectTask>();
678+
679+
db.Insert(new Project {Val = "test"});
680+
db.Insert(new ProjectTask {Val = "testTask", ProjectId = 1});
681+
682+
var query = db.From<ProjectTask>()
683+
.Join<ProjectTask, Project>((pt, p) => pt.ProjectId == p.Id);
684+
685+
var selectResults = db.Select(query);
686+
687+
var results = db.LoadSelect(query);
688+
689+
Assert.That(results.Count, Is.EqualTo(1));
690+
Assert.That(results[0].Val, Is.EqualTo("testTask"));
691+
}
692+
630693
[Test]
631694
public void Can_load_references_with_OrderBy_and_Paging()
632695
{
@@ -727,4 +790,35 @@ public class TABLE_3 : IHasId<int>
727790
[Reference]
728791
public TABLE_2 TableTwo { get; set; }
729792
}
793+
794+
[Schema("dbo")]
795+
[Alias("ProjectTask")]
796+
public class ProjectTask : IHasId<int>
797+
{
798+
[Alias("ProjectTaskId")]
799+
[Index(Unique = true)]
800+
[AutoIncrement]
801+
public int Id { get; set; }
802+
803+
[References(typeof (Project))]
804+
public int ProjectId { get; set; }
805+
806+
[Reference]
807+
public Project Project { get; set; }
808+
809+
public string Val { get; set; }
810+
}
811+
812+
[Schema("dbo")]
813+
[Alias("Project")]
814+
public class Project : IHasId<int>
815+
{
816+
[Alias("ProjectId")]
817+
[Index(Unique = true)]
818+
[AutoIncrement]
819+
public int Id { get; set; }
820+
821+
public string Val { get; set; }
822+
823+
}
730824
}

0 commit comments

Comments
 (0)