servicestack - TableAlias 不适用于多个联接

标签 servicestack

TableAlias 不适用于多个联接。

查询:

var q = Db.From<Blog>(Db.TableAlias("b"))
    .LeftJoin<Blog, BlogToBlogCategory>((b,btb)=> b.Id == btb.BlogId, Db.TableAlias("btbc"))
    .Join<BlogToBlogCategory, BlogCategory>((bt,bc)=>bt.BlogCategoryId == bc.Id, Db.TableAlias("cats"))
    .GroupBy(x => x.Id);
    .Select("b.*, json_agg(cats) as BlogCategoriesJson");

var results = Db.Select<BlogQueryResponse>(q);

生成此 SQL:

SELECT b.*, json_agg(cats) as BlogCategoriesJson
FROM "blog" "b" LEFT JOIN "blog_to_blog_category" "btbc" ON ("b"."id" = "btbc"."blog_id") INNER JOIN "blog_category" "cats" ON ("blog_to_blog_category"."blog_category_id" = "cats"."id")
GROUP BY "b"."id"

这会导致错误,因为它引用的是“blog_to_blog_category”而不是btbc

最佳答案

Db.TableAlias() 仅为目标联接表提供别名,您的内部联接未指定用于源表的别名,因此它按预期引用完整表名称。

您可以在 LINQ 表达式中使用 Sql.TableAlias() 来引用表别名,例如:

var q = Db.From<Blog>(Db.TableAlias("b"))
    .LeftJoin<Blog, BlogToBlogCategory>((b,btb)=> b.Id == btb.BlogId, Db.TableAlias("btbc"))
    .Join<BlogToBlogCategory, BlogCategory>((bt,bc)=>
         Sql.TableAlias(bt.BlogCategoryId, "btbc") == bc.Id, Db.TableAlias("cats"))
    .GroupBy(x => x.Id);
    .Select("b.*, json_agg(cats) as BlogCategoriesJson");

关于servicestack - TableAlias 不适用于多个联接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68122859/

相关文章:

servicestack - OrmLite/MySql/SqlExpressionVisitor - 需要 "like"子句

c# - 从依赖于另一个注册元素的 ServiceStack 的 IoC 容器解析

servicestack - 较新的 ServiceStack 对 New Relic 的报告很糟糕

servicestack - 调试自托管服务servicestack

c# - Swagger 和 ServiceStack 4.0

asp.net-mvc - nopCommerce 3.x 的最佳 API 策略(MVC、WebAPI 与 ServiceStack)

c# - Swagger 无法在自托管的 ServiceStack 服务上工作

razor - ServiceStack Razor : how do I render a Html. @section 内的局部 View ?

c# - ServiceStack 的 JSON 反序列化器解析无效的 JSON

servicestack - 是否可以根据 OpenApi 规范生成 ServiceStack DTO?