Я могу 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 строк.