Select 不同的加入 table

Select distinct on joined table

我有这个问题

var q = Db
    .From<Blog>()
    .LeftJoin<BlogToBlogCategory>()
    .Join<BlogToBlogCategory, BlogCategory>()
    .Where( .. )
    .SelectDistinct();

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

它生成这个 SQL:

SELECT DISTINCT "blog".*, 0 EOT, "blog_category".*, 0 EOT 
FROM "blog" LEFT JOIN "blog_to_blog_category" ON
("blog"."id" = "blog_to_blog_category"."blog_id") INNER JOIN "blog_category" ON
("blog_category"."id" = "blog_to_blog_category"."blog_category_id")
WHERE ...

我想 select 不同 blog_category 但是 select 也在添加所有 blog 字段所以我得到重复的 blog_category 条目。

如何 select 区分连接的 table 字段?

OrmLite 中,SqlExpression 是构建要执行的 SQL 查询的内容:

var q = Db
    .From<Blog>()
    .LeftJoin<BlogToBlogCategory>()
    .Join<BlogToBlogCategory, BlogCategory>()
    .Where( .. )
    .SelectDistinct();

虽然 API 用于执行查询将结果映射回指定的模型,但在这种情况下,您是说您希望将上述查询的结果映射到 BlogCategory POCO:

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

但您需要确保您创建的查询 returns 结果可以映射到您指定的 POCO。

如果您只想 select 不同的 BlogCategory 列,您需要在 SqlExpression 中执行此操作:

var q = Db
    .From<Blog>()
    .LeftJoin<BlogToBlogCategory>()
    .Join<BlogToBlogCategory, BlogCategory>()
    .Where( .. )
    .SelectDistinct<BlogCategory>(c => c);

或者,如果您想要 select 跨不同联接表的列,您将使用标准的匿名类型表达式:

var q = Db
    .From<Blog>()
    .LeftJoin<BlogToBlogCategory>()
    .Join<BlogToBlogCategory, BlogCategory>()
    .Where( .. )
    .SelectDistinct<Blog,BlogCategory>((b,c) => new { b.Id, c.Name, ... });

那么您将结果映射到的自定义模型应该具有与返回的列相匹配的属性:

var results = db.Select<BlogCategoryResult>(q);

或者,您可以使用 Dynamic Result Set API 访问自定义结果集。