有没有办法在 SQLKata 中操作现有查询?
Is there a way to manipulate the existing query in SQLKata?
我正在寻找一个灵活的 C# 查询生成器,它可以在没有完整 ORM 的所有开销的情况下工作。我正在考虑使用 SQL Kata,但我不确定是否涵盖了一个用例:
在我们的应用程序中,我们构建“基本”查询,从表中执行原始 select,然后将其用作我们执行分组和其他分析的子查询。当我们构建这些基本查询时,我们还不知道最终输出中实际需要哪些字段,因此我们将所有字段都包含在 select 列表中。
我正在寻找一种方法来查看最终查询,然后使用实际的 select 列表来限制基本查询正在检索的字段。这将为我们的柱状存储提供性能优势。
有没有办法在SQL Kata中遍历和修改查询?
类似于 - 显示外部查询中的所有字段,显示内部“基本”查询中的所有字段,然后让我修改内部 select 列表。
简短的回答是肯定的,您可以检查查询实例并遍历 selected 列,如下所示:
var columns = query.GetComponents<AbstractColumn>("select");
foreach(var column in columns)
{
if(column is Column col)
{
Console.WriteLine(col.Name);
} elseif(column is RawColumn raw) {
Console.WriteLine(col.Expression);
} elseif(column is QueryColumn subQuery) {
// do something with subQuery.Query
}
}
但我的建议是在不 selecting 任何列的情况下构建基本查询,
并在稍后阶段 select 仅需要的列。
请注意,在编译阶段,如果您不 select 任何列,SqlKata 会将其转换为 select *
,这在您的情况下很方便。
var baseQuery = new Query("TableOrViewHere as Report")
// at a later phase for example in the controller
// select the columns dynamically
var innerQuery = baseQuery.Clone().Select(Request.Columns);
var data = db.Query()
.From(innerQuery.As("inner"))
.Get();
我正在寻找一个灵活的 C# 查询生成器,它可以在没有完整 ORM 的所有开销的情况下工作。我正在考虑使用 SQL Kata,但我不确定是否涵盖了一个用例:
在我们的应用程序中,我们构建“基本”查询,从表中执行原始 select,然后将其用作我们执行分组和其他分析的子查询。当我们构建这些基本查询时,我们还不知道最终输出中实际需要哪些字段,因此我们将所有字段都包含在 select 列表中。
我正在寻找一种方法来查看最终查询,然后使用实际的 select 列表来限制基本查询正在检索的字段。这将为我们的柱状存储提供性能优势。
有没有办法在SQL Kata中遍历和修改查询?
类似于 - 显示外部查询中的所有字段,显示内部“基本”查询中的所有字段,然后让我修改内部 select 列表。
简短的回答是肯定的,您可以检查查询实例并遍历 selected 列,如下所示:
var columns = query.GetComponents<AbstractColumn>("select");
foreach(var column in columns)
{
if(column is Column col)
{
Console.WriteLine(col.Name);
} elseif(column is RawColumn raw) {
Console.WriteLine(col.Expression);
} elseif(column is QueryColumn subQuery) {
// do something with subQuery.Query
}
}
但我的建议是在不 selecting 任何列的情况下构建基本查询, 并在稍后阶段 select 仅需要的列。
请注意,在编译阶段,如果您不 select 任何列,SqlKata 会将其转换为 select *
,这在您的情况下很方便。
var baseQuery = new Query("TableOrViewHere as Report")
// at a later phase for example in the controller
// select the columns dynamically
var innerQuery = baseQuery.Clone().Select(Request.Columns);
var data = db.Query()
.From(innerQuery.As("inner"))
.Get();