我在使用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, });

10-04 19:52