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

Commit c4b30d2

Browse files
committed
Add support for References and ForeignKey attributes in implicit joins
1 parent 4d68a3c commit c4b30d2

File tree

2 files changed

+53
-4
lines changed

2 files changed

+53
-4
lines changed

src/ServiceStack.OrmLite/OrmLiteReadExtensions.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1036,14 +1036,16 @@ public static FieldDefinition GetRefFieldDef(ModelDefinition modelDef, ModelDefi
10361036
public static FieldDefinition GetRefFieldDefIfExists(ModelDefinition modelDef, ModelDefinition refModelDef)
10371037
{
10381038
var refField = refModelDef.FieldDefinitions.FirstOrDefault(x => x.FieldName == modelDef.ModelName + "Id")
1039-
?? refModelDef.FieldDefinitions.FirstOrDefault(x => x.Name == modelDef.Name + "Id");
1039+
?? refModelDef.FieldDefinitions.FirstOrDefault(x => x.Name == modelDef.Name + "Id")
1040+
?? refModelDef.FieldDefinitions.FirstOrDefault(x => x.ForeignKey != null && x.ForeignKey.ReferenceType == modelDef.ModelType);
10401041
return refField;
10411042
}
10421043

10431044
public static FieldDefinition GetSelfRefFieldDefIfExists(ModelDefinition modelDef, ModelDefinition refModelDef)
10441045
{
10451046
var refField = modelDef.FieldDefinitions.FirstOrDefault(x => x.FieldName == refModelDef.ModelName + "Id")
1046-
?? modelDef.FieldDefinitions.FirstOrDefault(x => x.Name == refModelDef.Name + "Id");
1047+
?? modelDef.FieldDefinitions.FirstOrDefault(x => x.Name == refModelDef.Name + "Id")
1048+
?? modelDef.FieldDefinitions.FirstOrDefault(x => x.ForeignKey != null && x.ForeignKey.ReferenceType == refModelDef.ModelType);
10471049

10481050
return refField;
10491051
}

tests/ServiceStack.OrmLite.Tests/LoadReferencesJoinTests.cs

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
using System.Data;
22
using System.Linq;
33
using NUnit.Framework;
4+
using ServiceStack.DataAnnotations;
5+
using ServiceStack.Model;
46
using ServiceStack.OrmLite.Tests.UseCase;
57

68
namespace ServiceStack.OrmLite.Tests
@@ -174,7 +176,7 @@ public void Can_do_joins_with_complex_wheres_using_SqlExpression()
174176
var costs = results.ConvertAll(x => x.Cost);
175177
Assert.That(costs, Is.EquivalentTo(new[] { 1.99m, 1.49m, 9.99m }));
176178
var orderIds = results.ConvertAll(x => x.OrderId);
177-
var expectedOrderIds = new []{customers[0].Orders[0].Id, customers[0].Orders[2].Id, customers[0].Orders[4].Id};
179+
var expectedOrderIds = new[] { customers[0].Orders[0].Id, customers[0].Orders[2].Id, customers[0].Orders[4].Id };
178180
Assert.That(orderIds, Is.EquivalentTo(expectedOrderIds));
179181

180182
//Same as above using using db.From<Customer>()
@@ -432,7 +434,7 @@ public void Does_populate_custom_columns_based_on_property_convention()
432434
Assert.That(addressIds, Is.EquivalentTo(expectedAddressIds));
433435

434436
var orderIds = results.ConvertAll(x => x.OrderId);
435-
var expectedOrderIds = new[] {customer.Orders[0].Id, customer.Orders[1].Id};
437+
var expectedOrderIds = new[] { customer.Orders[0].Id, customer.Orders[1].Id };
436438
Assert.That(orderIds, Is.EquivalentTo(expectedOrderIds));
437439

438440
var customerNames = results.ConvertAll(x => x.CustomerName);
@@ -546,5 +548,50 @@ public void Can_load_list_of_references()
546548
Assert.That(results[0].Orders.Select(x => x.Cost),
547549
Is.EquivalentTo(new[] { 1.99m, 3.98m, 1.49m, 2.98m, 9.99m }));
548550
}
551+
552+
[Test]
553+
public void Can_join_on_references_attribute()
554+
{
555+
db.DropAndCreateTable<TABLE_1>();
556+
db.DropAndCreateTable<TABLE_2>();
557+
558+
var id1 = db.Insert(new TABLE_1 { One = "A" }, selectIdentity: true);
559+
var id2 = db.Insert(new TABLE_1 { One = "B" }, selectIdentity: true);
560+
561+
db.Insert(new TABLE_2 { Three = "C", TableOneKey = (int) id1 });
562+
563+
var q = db.From<TABLE_1>()
564+
.Join<TABLE_2>();
565+
var results = db.Select(q);
566+
567+
Assert.That(results.Count, Is.EqualTo(1));
568+
Assert.That(results[0].One, Is.EqualTo("A"));
569+
}
570+
}
571+
572+
[Alias("Tabela1")]
573+
public class TABLE_1 : IHasId<int>
574+
{
575+
[AutoIncrement]
576+
[Alias("Key")]
577+
public int Id { get; set; }
578+
579+
[Alias("Ena")]
580+
public string One { get; set; }
581+
}
582+
583+
[Alias("Tabela2")]
584+
public class TABLE_2 : IHasId<int>
585+
{
586+
[AutoIncrement]
587+
[Alias("Key")]
588+
public int Id { get; set; }
589+
590+
[Alias("Tri")]
591+
public string Three { get; set; }
592+
593+
[References(typeof(TABLE_1))]
594+
[Alias("Tabela1")]
595+
public int TableOneKey { get; set; }
549596
}
550597
}

0 commit comments

Comments
 (0)