IQueryable.ToList 方法搞乱了 T-SQL 排序顺序
IQueryable.ToList method messing up with T-SQL sorting order
我正在使用 EF Code First,并且我有一个 Entity Framework(针对 Oracle 数据库)。为了简单起见,我将恢复场景。假设我有 table 个这样的产品:
ProductName (varchar)
A
1
C
2
B
3
4
嗯,所以我使用 EF 构建了一个查询:
var query = Repo.Products.AsQueryable().OrderBy(p => p.ProductName);
我调试的时候,得到生成的SQL,在oracle中执行,一切正常,结果集是:
1
2
3
4
A
B
C
鉴于字符的优先顺序,这是正确的(记住字段是 varchar/string)。
好的,现在如果我执行以下操作:
var list = query.ToList();
结果是:
A
B
C
1
2
3
4
这是错误的,与Oracle结果集不同。如果我在 OrderBy() 之前调用 ToList(),结果排序正确,但我不想在之前调用 ToList() 以避免在过滤之前获取所有记录。
我真的快被这个搞疯了。有人可以帮忙吗?
我明白了!
问题是 Oracle 中的 NLS_SORT 变量。奇怪的是 PL/SQL Manager Developer 显示 "right" 顺序,数字在前,但不同行为的原因是因为它更改了 NLS_SORT 变量会话,并且 Entity Framework 没有。
我只是在执行任何查询之前将 NLS_SORT 设置为 'BINARY',仅此而已!
已解决!
谢谢。
我正在使用 EF Code First,并且我有一个 Entity Framework(针对 Oracle 数据库)。为了简单起见,我将恢复场景。假设我有 table 个这样的产品:
ProductName (varchar)
A
1
C
2
B
3
4
嗯,所以我使用 EF 构建了一个查询:
var query = Repo.Products.AsQueryable().OrderBy(p => p.ProductName);
我调试的时候,得到生成的SQL,在oracle中执行,一切正常,结果集是:
1
2
3
4
A
B
C
鉴于字符的优先顺序,这是正确的(记住字段是 varchar/string)。
好的,现在如果我执行以下操作:
var list = query.ToList();
结果是:
A
B
C
1
2
3
4
这是错误的,与Oracle结果集不同。如果我在 OrderBy() 之前调用 ToList(),结果排序正确,但我不想在之前调用 ToList() 以避免在过滤之前获取所有记录。
我真的快被这个搞疯了。有人可以帮忙吗?
我明白了!
问题是 Oracle 中的 NLS_SORT 变量。奇怪的是 PL/SQL Manager Developer 显示 "right" 顺序,数字在前,但不同行为的原因是因为它更改了 NLS_SORT 变量会话,并且 Entity Framework 没有。
我只是在执行任何查询之前将 NLS_SORT 设置为 'BINARY',仅此而已!
已解决!
谢谢。