我希望使用ORMLite对多个别名表进行分组,但是似乎遇到了问题。
[当在SqlExpression的GroupBy中使用带有匿名类型的Sql.TableAlias时,为组生成的SQL包含来自匿名类型的属性名称(即AliasName。“ Column”作为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();
在brokenGroupBy字符串中生成并存储的SQL是以下内容:
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
在这种情况下是否不支持表别名,或者在这种情况下是否可以通过其他方式指定分组依据?
我使用by分组中的自定义SQL表达式已达到我想要的结果,但希望使用不需要SQL字符串的解决方案。
我已经发布了v5.8.1(现在为available on MyGet)对OrmLite的更新,该更新还将从“分组依据表达式”中删除别名,以便从表达式中分组:
.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"
})