在ServiceStack.OrmLite

时间:2018-11-22 18:23:03

标签: ormlite-servicestack

将表联接到自身时,生成的sql语句未正确引用表。

当“主”表与联接表https://github.com/ServiceStack/ServiceStack.OrmLite#join-aliases不同时,它就起作用了

课程

public class Page
{
    public string ActivityId { get; set; }
    public int DefinitionId { get; set; }
    public int PageId { get; set; }
}

代码

using (var db = connection.Open())
{
    var sql = db.From<Page>()
     .Join<Page>((p1, p2) => 
       p1.DefinitionId == 349 && 
       p1.ActivityId == "a633326227969545457" && 
       p1.PageId == p2.PageId && 
       p2.DefinitionId == 340, db.JoinAlias("p2"))
     .Select<Page>(p => new {
            String = Sql.JoinAlias(p.ActivityId, "p2")
     });

}

SQL语句

p1 .DefinitionId == 349和 p1 .ActivityId ==“ a633326227969545457”,这些不应引用 p2

SELECT p2."ActivityId" AS String 
FROM "Page" INNER JOIN "Page" p2 ON (
    ((("p2"."DefinitionId" = 349) 
  AND ("p2"."ActivityId" = 'a633326227969545457')) 
  AND ("p2"."PageId" = "p2"."PageId")) 
  AND ("p2"."DefinitionId" = 340))

是错误还是我在这里遗漏了什么?

1 个答案:

答案 0 :(得分:1)

为了能够在源表上使用别名,您需要设置一个表别名,this commit到目前为止还不支持。

您现在可以在源表以及任何联接表上使用新的db.TableAlias() API(现在比JoinAlias()更好),例如:

var q = db.From<Page>(db.TableAlias("p1"))
    .Join<Page>((p1, p2) => 
        p1.DefinitionId == 349 && 
        p1.ActivityId == "a633326227969545457" && 
        p1.PageId == p2.PageId && 
        p2.DefinitionId == 340, db.TableAlias("p2"))
    .Select<Page>(p => new {
        String = Sql.TableAlias(p.ActivityId, "p2")
    });

var rows = db.Select(q);

此更改可从v5.4.1(现在为available on MyGet)中获得。