C# EasyQuery-将Select语句中的所有列括在括号中

C# EasyQuery-将Select语句中的所有列括在括号中,c#,sql,sql-server,sql-server-2016,easyquery,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.Se

我有生成动态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”上仍然有错误,不知何故,我需要获得引号以覆盖所有列,而不仅仅是带有空格的列…

SqlQueryBuilder类有
格式
属性,其中包括
QuoteColumnAlias
选项。启用该选项可使SqlQueryBuilder获取引号(或括号)中的列别名


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

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

似乎可以正常工作,所有列都已正确包装,查询执行时不会出错。

根据EasyQuery文档,您可以通过数据模型中的设置来执行此操作:在SQL中引用字段名复选框表示字段名是否应在SQL语句中加引号。对于包含一些保留字的字段名很有用。带空格的字段名将被自动引用。@LaughingVergil我相信您可以,但不幸的是,我无法在EasyQuery的文档中找到该属性,并且我没有看到任何名为“Quote”或“Field”的属性作为模型的一部分,也许你有一个代码示例或一个指向上述文档的链接,可以帮助我澄清问题?是的,如果我使用的是数据模型,那么这将起作用,但在本例中,我使用“LoadFromConnection”方法来动态设置数据库。在连接到数据库之前,我不知道数据库布局(也没有能力写入数据库),这是我问这个问题的另一个复杂原因,否则我只会编写一系列包含净化列名的视图,然后过滤到该列名。既然我不能这样做,我也不能写一个数据模式,有没有其他方法可以做到这一点?是死的,404链接当你提交你的票。未列出支持电子邮件地址,此地址可能无法很快解决:(现在运行良好。几天前,网站更新期间出现了一个错误,导致404出现问题。很抱歉给您带来不便。嗯,似乎不起作用,我已在问题中添加了详细信息。对于特定的
Open
属性,您需要打开Quote选项。您可以使用数据模型编辑器进行操作(如果“手动”创建模型)。否则(例如,如果从DbContext加载模型),可以在加载模型后立即在代码中执行:var attr=model.FindEntityAttr(“DataImport_2018.Open”);(attr作为DbEntityAttr).Quote=false;哎哟,所以没有通用的方法可以做到这一点。嗯,这很棘手,我使用工具集的方式太过针对每个实现的新数据库,不幸的是,我无法提前预测数据库。也许我可以迭代所有“EntityAttr”并启用“Quote”或者为所有人都这样做?事实上,这可能会奏效,我会尝试一下……是的,您可以很容易地做到:model.EntityRoot.Scan(null,attr=>(attr as DbEntityAttr.Quote=true);您可以用更简单的方式为整个模型(而不仅仅是参与查询的属性)执行此操作:EasyQueryCachedObject.model.EntityRoot.Scan(null,attr=>(attr作为DbEntityAttr.Quote=true);
foreach (var column in EasyQueryCachedObject.Columns)
{
    if (column.Expr.GetType() == typeof(DbEntityAttrExpr))
    {
        ((DbEntityAttrExpr)column.Expr).Attribute.Quote = true;
    }
}