代码之家  ›  专栏  ›  技术社区  ›  David Rogers

EasyQuery-将Select语句中的所有列用括号括起来

  •  1
  • David Rogers  · 技术社区  · 7 年前

    我有生成动态SQL语句的简单查询代码:

    //Model is loaded with "model.LoadFromConnection"
    var EasyQueryCachedObject = new DbQuery();
    EasyQueryCachedObject.Model = model; //Specified before
    EasyQueryCachedObject.Model.Description = "XXX";
    EasyQueryCachedObject.Formats.SetDefaultFormats(FormatType.MsSqlServer);
    
    ... //More logic to form query
    
    var builder = new SqlQueryBuilder(EasyQueryCachedObject);
    
    if (builder.CanBuild)
    {
        builder.BuildSQL();
        var SQLQuery = builder.Result.SQL;
        var QueryXML = builder.Result.Query.SaveToString();
    }
    

    问题是,我正在查询生成SQL的表,例如:

    SELECT Entry No 
        ,Item No 
        ,Open
    FROM.[dbo].[DataImport_2013]
    

    由于列名包含保留字/空格,因此失败。如何让EasyQuery用方括号将所有列括起来,如下所示?

    SELECT [Entry No ]
        ,[Item No ]
        ,[Open]
    FROM.[dbo].[DataImport_2013]
    

    显然,使用EasyQuery的内置参数的解决方案是首选的,但是如果这不可能,也许某种正则表达式或后模型填充也可以工作,真的,我对任何解决方案都持开放态度。

    更新1

    尝试了几种方法,包括“QuoteColumnAlias”,生成的查询类似于以下内容:

    SELECT DataImport_2018."Entry No " AS "DataImport_2018 Entry No", 
        DataImport_2018."Item No " AS "DataImport_2018 Item No", 
        DataImport_2018.Open AS "DataImport_2018 Open" 
    FROM dbo.DataImport_2018 AS DataImport_2018
    

    保留词“open”仍然有错误,不知怎么的,我需要让引号覆盖所有的栏目,而不仅仅是那些有空格的。。。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Sergiy    7 年前

    Formats SqlQueryBuilder类的属性,其中包括 QuoteColumnAlias 选择。启用该选项可使SqlQueryBuilder采用引号(或括号)中的列别名。

    builder.Formats.QuoteColumnAlias = true;
    build.BuildSQL();
    .   .   .   .   .
    
        2
  •  0
  •   David Rogers    7 年前

    @Sergiy的评论非常有用,我在加载模型后想出了一个方法:

    foreach (var column in EasyQueryCachedObject.Columns)
    {
        if (column.Expr.GetType() == typeof(DbEntityAttrExpr))
        {
            ((DbEntityAttrExpr)column.Expr).Attribute.Quote = true;
        }
    }
    

    似乎工作正常,所有列都被正确包装,查询执行时没有错误。

    推荐文章