Соединение с одной и той же таблицей несколько раз в ServiceStack.OrmLite - PullRequest
0 голосов
/ 22 ноября 2018

При соединении таблицы с самим собой сгенерированный 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 голосов
/ 23 ноября 2018

Чтобы иметь возможность использовать псевдоним в исходной таблице, вам нужно установить псевдоним таблицы, который до сих пор не поддерживался с этим коммитом .

Теперь вы можетеиспользуйте новый 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, которое сейчас доступно на MyGet .

...