我在使用OrmLite填充POCO中的某些列时遇到了一些困难。我有三个表,分别为Dog,Bowl和DogBowl。 DogBowl是一个联结表,其中包含Dog和Bowl的ID。
Dogs
PK Id: int, not null
Breed: varchar(20), not null
Name: varchar(20), not null
Bowls
PK Id: int, not null
Type: varchar(20), not null
Color: varchar(20), not null
Dogs_Bowls
PK: DogId, not null
PK: BowlId, not null
这是我映射的POCO
public class Dog : IHasId<int>
{
[AutoIncrement]
public int Id { get; set; }
[Required]
public string Breed { get; set; }
[Required]
public string Name { get; set; }
}
public class Bowl : IHasId<int>
{
[AutoIncrement]
public int Id { get; set; }
[Required]
public string Type { get; set; }
[Required]
public string Color { get; set; }
}
public class DogBowl
{
[Required]
public int DogId { get; set; }
[Required]
public int BowlId { get; set; }
[Ignore]
public string DogName { get;set; }
[Ignore]
public string BowlColor { get;set; }
}
这是我正在运行的C#代码。
var dogBowl = db.Select<DogBowl>(db
.From<Dog>()
.Join<Dog, DogBowl>((d, db) => d.Id == db.DogId)
.Join<DogBowl, Bowl>((db, b) => db.BowlId == b.Id)
.Where<Dog>(d => d.Id == 5))
.ToList();
我想产生的SQL是这样的:
select
db.DogId,
db.BowlId,
d.Name AS DogName,
b.Color as BowlColor
from DogBowl db
join dog d on db.DogId = d.Id
join bowl b on db.BowlId = b.Id
where d.Id = 5
我的问题是代码执行后,DogBowl.DogName和DogBowl.BowlColor属性为null。我正在使用https://github.com/ServiceStack/ServiceStack.OrmLite上标题为“在连接的表中选择多个列”的部分中提供的说明,但是它不起作用。如何获取填充的DogBowl.DogName和DogBowl.BowlColor属性?
最佳答案
生成的SQL可能是正确的。您可以在执行后通过检查属性db.GetLastSql()来验证生成的SQL。
问题是通过将结果分配为
db.Select<DogBowl>
,您正在创建DogBowl对象的列表。 DogBowl属性DogName和BowlColor始终为null,因为SQL语句中没有与这些名称完全匹配的字段。 OrmLite不会神奇地找出问题所在-您必须按名称匹配它们。
如果要使用Dog和Bowl中的字段将结果分配给“平面”对象,则可以定义一个新的DTO并分配结果,如下所示:
public class FullDogBowl
{
public int DogId { get; set; }
public int BowlId { get; set; }
public string Breed { get; set; }
public string Name { get; set; }
public string Type { get; set; }
public string Color { get; set; }
}
var dogBowl = db.Select<FullDogBowl>(db
.From<Dog>()
.Join<Dog, DogBowl>((d, db) => d.Id == db.DogId)
.Join<DogBowl, Bowl>((db, b) => db.BowlId == b.Id)
.Where<Dog>(d => d.Id == 5))
.ToList();
另外,如果您确切知道要使用的SQL,请使用它:
string sql = @"select
db.DogId,
db.BowlId,
d.Name AS DogName,
b.Color as BowlColor
from DogBowl db
join dog d on db.DogId = d.Id
join bowl b on db.BowlId = b.Id
where d.Id = @dog_id ";
var dogBowlList = db.SqlList<DogBowl>(sql, new { dog_id = 5, });