我遇到了这样一种情况,查询将通过EF在应用程序中运行,但不在我的SQL控制台/ IDE中运行,反之亦然。例如,当我将VARCHAR2列转换为BINARY_FLOAT(如linq代码所示)时,即格式为50.23%的数据将转换为50.23然后进行转换。 sql控制台说,带逗号的任何内容都是无效数字,而EF没有。将该逗号更改为点,将使EF报告ORA错误“无效数字”,但控制台随后可以工作。
var query = db.OWNER
.Where(o => o.CASE_ID == caseId && o.STOCK != null && o.STOCK.EndsWith("%"))
.Select(o => o.STOCK.Replace("%", "")).Cast<float>();
var result = query.ToList();
EF在哪里使用此本地化配置?更具体地说,如何更改十进制数字格式?
答案 0 :(得分:1)
这可能是CultureInfo问题,请尝试显式设置小数点分隔符?
CultureInfo culture = new CultureInfo("en-US");
culture.NumberFormat.NumberDecimalSeparator = ".";
Thread.CurrentThread.CurrentCulture = culture;
Thread.CurrentThread.CurrentUICulture = culture;
答案 1 :(得分:1)
当前线程与数据库之间的区域性差异。
当您打开与数据库的连接并准备查询时,EF会像使用添加参数功能一样操作参数以避免SQL注入。
这时,无论是日期对象还是小数或其他特定于区域性的数据类型,将作为查询的最终字符串都将转换为特定于数据库区域性的格式。
当您在SQL Studio中显式编写错误的区域性时,内联解析器将了解它不是正确的语言环境。
如果您尝试在没有正确的区域性格式的情况下进行转换,则代码中也会发生同样的事情。