ServiceStack ORMLite:具有表别名的多列组

问题描述 投票:1回答:1

我希望使用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字符串的解决方案。

ormlite-servicestack
1个回答
0
投票

我已经发布了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"
})
© www.soinside.com 2019 - 2024. All rights reserved.