EasyQuery-在括号中的选择语句中包装所有列

时间:2018-08-09 22:34:07

标签: c# sql sql-server sql-server-2016 easyquery

我有简单的查询代码来生成动态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内置参数的解决方案,但是如果不可能,则某些正则表达式或后期模型填充也可能适用,实际上,我愿意接受任何能够满足需求的解决方案。 / p>

更新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 个答案:

答案 0 :(得分:1)

SqlQueryBuilder类的Formats属性具有QuoteColumnAlias选项。启用它以使SqlQueryBuilder在引号(或方括号)中采用列别名。

builder.Formats.QuoteColumnAlias = true;
build.BuildSQL();
.   .   .   .   .

答案 1 :(得分:0)

@Sergiy的评论非常有帮助,我想出了一种在加载模型后进行处理的方法:

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

似乎可以正常工作,所有列均已正确包装,并且查询执行无误。