IQueryable.ToList方法弄乱了T-SQL排序顺序

时间:2015-01-15 20:20:33

标签: c# linq linq-to-entities tolist

我使用的是EF Code First,我有一个Linq To SQL(针对Oracle数据库)。为了简单起见,我将恢复这个场景。假设我有这样的表产品:

ProductName (varchar)
A
1
C  
2
B
3
4

好吧,所以我使用EF构建查询:

var query = Repo.Products.AsQueryable().OrderBy(p => p.ProductName);

当我调试时,我得到生成的T-SQL并在oracle中执行,everthing没问题,结果集是:

1
2
3
4
A
B
C

这是正确的(记住字段是varchar / string)给定字符的优先顺序。

好的,现在如果我执行以下操作:

var list = query.ToList();

结果是:

A
B
C
1
2
3
4

这是错误的,与Oracle结果集不同。如果我在OrderBy()之前调用ToList(),结果会正确排序,但我不想之前调用ToList()以避免在过滤之前获取所有记录。

我真的为此疯狂了。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

我明白了!

问题是Oracle中的NLS_SORT变量。奇怪的是,PL / SQL管理器开发人员显示“正确”的顺序,首先是数字,但不同行为的原因是因为它改变了NLS_SORT变量会话,而实体框架没有。

我只是在执行任何查询之前将NLS_SORT设置为'BINARY',就是这样!

解决!

感谢。