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);
我有一个导出查询 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);