【问题标题】:Is there a way to manipulate the existing query in SQLKata?有没有办法操纵 SQLKata 中的现有查询?
【发布时间】:2020-07-01 10:29:25
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# sqlkata


    【解决方案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();
    

    【讨论】:

    • 非常有帮助...我可以修改列列表(如删除一个)吗?
    • 您将选择列推迟到以后的第二个想法也是一个好主意
    猜你喜欢
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多