有没有办法在 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();