Select 多个表和自定义列到 POCO

Select multiple tables and custom column to POCO

我有一个导出查询 returns 多个 table 有很多列。

var q = db.From<Blog>()
        .Join<Blog, UserAuthCustom>((b, u) => b.UserAuthCustomId == u.Id)
        .Join<UserAuthCustom, BloggerProfile>((u, bp) => u.Id == bp.UserAuthCustomId)
        .Join<Blog, BlogToBlogCategory>((b,bc)=> b.Id == bc.BlogId)
        .Join<BlogToBlogCategory, BlogCategory>((btbc, bc) => btbc.BlogCategoryId == bc.Id)
        .GroupBy<Blog, UserAuthCustom, BloggerProfile>((b, u, bp) => new { t1 = b.Id, t2 = u.Id, t3 = bp.Id });
        
q.Select<Blog, UserAuthCustom, BloggerProfile>((b,u,bp) => new {
    Blog = b,
    UserAuthCustom = u,
    BloggerProfile = bp,
    BlogCategroiesJson = Sql.Custom($"json_agg({q.Table<BlogCategory>()})")
});

此查询生成了正确的 SQL 但我很难将其放入 POCO。

我做了这个class:

public class BlogImportExportIntermediate
{
    public Blog Blog { get; set; }
    public UserAuthCustom UserAuthCustom { get; set; }
    public BloggerProfile BloggerProfile { get; set; }
    private string _blogCategroiesJson { get; set; }

    public string BlogCategroiesJson
    {
        get => _blogCategroiesJson;

        set
        {
            _blogCategroiesJson = value;
            BlogCategories = PostgreSqlMethods.FromJson<List<BlogCategory>>(value);
        }
    }

    public List<BlogCategory> BlogCategories { get; set; }
}

但如果我尝试:

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

那么它只匹配BlogCategroiesJson。我想它必须将列名称与 属性 名称匹配,并且不会将整个 table 处理为 属性.

我可以通过选择元组来获取除类别之外的所有内容:

var results = db.Select<Tuple<Blog, UserAuthCustom, BloggerProfile>>(q);

但是我如何才能在单个查询中完全填充 BlogImportExportIntermediate 而不必在每个 table 上指定每一列?

我试过:

var results = db.Select<Tuple<Blog, UserAuthCustom, BloggerProfile, string>>(q);

但这给出了对象引用错误。我试过尝试让 BlogCategroiesJson 成为自己的 class 但无法让它工作。

我在导出函数中使用此查询,因此在单个查询中获取所有内容会很有帮助,因为它可能是一个很大的结果集。

有什么方法可以做到这一点?

您不能在同一个元组或多个 select API 中混合 Table 类型和标量类型,您要么需要 select 所有 Table 类型或所有标量类型。

您可以尝试将 Json 列包装在与 selected 列同名的 POCO 类型中,例如:

public class BlogCategoryJson
{
    public string BlogCategroiesJson { get; set; }
}

var results = db.Select<Tuple<Blog,UserAuthCustom,BloggerProfile,BlogCategoryJson>>(q);