EF挪威文化下生成含不支持减号的MS SQL查询问题求助
问题与解决方案
场景与问题
必须在请求开始时设置挪威博克马尔语(nb-NO)文化,业务流程中大量逻辑依赖该文化,初始化代码如下:
//代码起始处 var noCulture = new CultureInfo("nb-NO"); CultureInfo.CurrentCulture = noCulture; CultureInfo.CurrentUICulture = noCulture;
使用Entity Framework 6.4.4执行查询时,出现SQL语法错误:
var entities = ( from record in _dbConterxt.Records //其他无关联表等 select new RecordDto { //其他无关属性 Status = Status ?? -1 } ).ToList();
生成的SQL中,常量-1被转换为挪威文化的U+2212减号,而非SQL支持的U+002D连字符减号:
CASE WHEN ([Filter1].[Status] IS NULL) THEN −1 ELSE [Filter1].[Status] END AS [C9],
执行时抛出错误:
执行命令定义时出错,请查看内部异常了解详情。'−'附近有语法错误,关键字'AS'附近有语法错误。
要求:不能移除挪威文化设置,不能修改查询中的-1常量(遗留代码多处存在类似写法)。
解决方案
核心思路:EF生成SQL时会受当前线程文化影响,因此临时切换到不变文化执行查询,执行完成后恢复原文化,既不影响业务逻辑对挪威文化的依赖,也无需修改查询代码。
实现方式:扩展方法封装查询执行逻辑
编写扩展方法,在执行查询的前后切换文化:
public static class QueryableExtensions { // 封装ToList方法,临时使用不变文化生成SQL public static List<T> ToListWithInvariant<T>(this IQueryable<T> query) { // 保存当前文化 var originalCulture = CultureInfo.CurrentCulture; var originalUiCulture = CultureInfo.CurrentUICulture; try { // 临时切换到不变文化,确保SQL生成使用标准符号 CultureInfo.CurrentCulture = CultureInfo.InvariantCulture; CultureInfo.CurrentUICulture = CultureInfo.InvariantCulture; return query.ToList(); } finally { // 恢复原挪威文化,不影响后续业务逻辑 CultureInfo.CurrentCulture = originalCulture; CultureInfo.CurrentUICulture = originalUiCulture; } } // 可按需扩展其他查询执行方法,比如FirstOrDefault、Single等 public static T FirstOrDefaultWithInvariant<T>(this IQueryable<T> query) { var originalCulture = CultureInfo.CurrentCulture; var originalUiCulture = CultureInfo.CurrentUICulture; try { CultureInfo.CurrentCulture = CultureInfo.InvariantCulture; CultureInfo.CurrentUICulture = CultureInfo.InvariantCulture; return query.FirstOrDefault(); } finally { CultureInfo.CurrentCulture = originalCulture; CultureInfo.CurrentUICulture = originalUiCulture; } } }
使用方式
将原查询中的.ToList()替换为.ToListWithInvariant()即可:
var entities = ( from record in _dbConterxt.Records //其他无关联表等 select new RecordDto { //其他无关属性 Status = Status ?? -1 } ).ToListWithInvariant();
这种方式无需修改任何业务逻辑和查询常量,仅通过封装查询执行过程解决SQL符号问题。
内容的提问来源于stack exchange,提问作者pwas
相关产品推荐
相关产品推荐

