1

我正在寻找一个灵活的 C# 查询生成器,它可以在没有完整 ORM 的所有开销的情况下工作。我正在考虑使用 SQL Kata,但我不确定是否涵盖了一个用例:

在我们的应用程序中,我们构建从表中进行原始选择的“基本”查询,然后将其用作子查询,我们在该子查询上执行分组和其他分析。当我们构建这些基本查询时,我们还不知道最终输出中实际需要哪些确切的字段,因此我们将所有字段都包含在选择列表中。

我正在寻找的是一种查看最终查询的方法,然后使用实际的选择列表来限制基本查询正在检索哪些字段。这将为我们的列式存储提供性能优势。

有没有办法遍历和修改 SQL Kata 中的查询?
类似于 - 显示外部查询中的所有字段,显示内部“基本”查询中的所有字段,然后让我修改内部选择列表。

4

1 回答 1

1

简短的回答是肯定的,您可以检查查询实例并遍历选定的列,如下所示:

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
    }    
}

但我建议在不选择任何列的情况下构建基本查询,并在稍后阶段仅选择所需的列。

请注意,在编译阶段,如果您不选择任何列 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();
于 2020-07-01T11:03:04.937 回答