ServiceStack ORMLite: группа столбцов Mutliple с псевдонимами таблиц - PullRequest
2 голосов
/ 11 февраля 2020

Я могу sh использовать ORMLite для группировки по нескольким псевдонимам таблиц, но я, кажется, столкнулся с проблемой.

При использовании Sql .TableAlias ​​с анонимным типом в GroupBy SqlExpression SQL, созданный для группы, содержит имя свойства из анонимного типа (т.е. AliasName. "Column" As PropertyName).

Код ниже может воспроизвести эту проблему:

public class Thing
{
    public int? Id { get; set; }
}

public class Stuff
{
    public int? Id { get; set; }
    public int? ThingId { get; set; }
    public int? Type { get; set;  }
}

string brokenGroupBy = db
    .From<Thing>()
    .Join<Stuff>((thing, stuff) => stuff.ThingId == thing.Id && stuff.Type == 1, db.TableAlias("StuffTypeOne"))
    .Join<Stuff>((thing, stuff) => stuff.ThingId == thing.Id && stuff.Type == 2, db.TableAlias("StuffTypeTwo"))
    .GroupBy<Thing, Stuff>((thing, stuff) => new
    {
        ThingId = thing.Id,
        StuffTypeOneId = Sql.TableAlias(stuff.Id, "StuffTypeOne"),
        StuffTypeTwoId = Sql.TableAlias(stuff.Id, "StuffTypeTwo")
    })
    .Select<Thing, Stuff>((thing, stuff) => new
    {
        ThingId = thing.Id,
        StuffTypeOneId = Sql.TableAlias(stuff.Id, "StuffTypeOne"),
        StuffTypeTwoId = Sql.TableAlias(stuff.Id, "StuffTypeTwo")
    })
    .ToMergedParamsSelectStatement();

SQL, сгенерированный и сохраненный в строке brokenGroupBy, выглядит следующим образом:

SELECT "thing"."id"      AS "ThingId", 
       StuffTypeOne."id" AS StuffTypeOneId, 
       StuffTypeTwo."id" AS StuffTypeTwoId 
FROM   "thing" 
       INNER JOIN "stuff" "StuffTypeOne" 
               ON ( ( "StuffTypeOne"."thingid" = "thing"."id" ) 
                    AND ( "StuffTypeOne"."type" = 1 ) ) 
       INNER JOIN "stuff" "StuffTypeTwo" 
               ON ( ( "StuffTypeTwo"."thingid" = "thing"."id" ) 
                    AND ( "StuffTypeTwo"."type" = 2 ) ) 
GROUP  BY "thing"."id", 
          StuffTypeOne."id" AS stufftypeoneid, 
          StuffTypeTwo."id" AS stufftypetwoid 

В этом случае не поддерживаются псевдонимы таблиц или существует другой способ указания группы в этом сценарии?

Я достиг желаемого результата с помощью пользовательского выражения SQL в группе, но предпочел бы решение, не требующее SQL строк.

1 Ответ

2 голосов
/ 11 февраля 2020

Я опубликовал обновление для OrmLite, доступное с v5.8.1, теперь доступно на MyGet , которое также удалит псевдонимы из выражений Group By, поэтому ваша группа будет выражаться выражением:

.GroupBy<Thing, Stuff>((thing, stuff) => new
{
    ThingId = thing.Id,
    StuffTypeOneId = Sql.TableAlias(stuff.Id, "StuffTypeOne"),
    StuffTypeTwoId = Sql.TableAlias(stuff.Id, "StuffTypeTwo")
})

Теперь должно сгенерировать что-то вроде:

thing.Id, "StuffTypeOne"."Id", "StuffTypeTwo"."Id"

Хотя, поскольку вы уже определили псевдонимы в своем выражении SELECT, вы можете использовать их вместо:

.GroupBy<Thing, Stuff>((thing, stuff) => new
{
    ThingId = thing.Id,
    StuffTypeOneId = "StuffTypeOneId",
    StuffTypeTwoId = "StuffTypeTwoId"
})

Или вы можете использовать массив объектов для более краткого выражения:

.GroupBy<Thing, Stuff>((thing, stuff) => new object[]
{
    thing.Id,
    "StuffTypeOneId",
    "StuffTypeTwoId"
})
...