提问人:John Saunders 提问时间:1/7/2011 最后编辑:John Saunders 更新时间:2/18/2011 访问量:3561
如何在.NET中排序,与SQL Server排序规则相同?
How to Sort in .NET Same as a SQL Server Collation?
问:
我一直在对一些现有的存储过程做一些TDD。它们返回 XML,因此我一直在使用 LINQ to XML。
目前,我正在进行一项测试,以证明数据已正确排序。该测试在 XML 中导航,并创建一个匿名类型的 IEnumerable,其中包含应排序的三列。在此基础上,它通过对第一个 IEnumerable 进行排序来创建第二个 IEnumerable:
var sortedColumns = from g in columns
orderby g.ColumnA ascending,
g.ColumnB ascending,
g.ColumnC ascending
select g;
最后,它使用 SequenceEquals 断言排序的列与未排序的列相同。
当数据库排序规则与当前排序规则不同时,就会出现问题。具体而言,.NET 将 ColumnB 中的“W-”放在“Wa”之前。
有没有办法按照与任意 SQL Server 排序规则相同的顺序进行排序?如果没有,那么我将如何按照与SQL_Latin1_General_CP1_CI_AS相同的顺序进行排序?
答:
LINQ-to-SQL 不支持直接使用排序规则。如果要实现特殊排序,则必须在本地获取数据,将其转换为列表(或其他内容),然后自己进行排序。
有关进一步参考,请参阅以下两个链接:
评论
我已经从 use-own-icomparert-with-linq-orderby 中删除了它。
MyComparer comparer = new MyComparer();
items = items.OrderByDescending(
x => property.GetValue(x), comparer).ToList();
break;
您可以根据需要创建自定义比较器。(你可能需要一个具体类型而不是一个匿名类型来获得你的结果 - 我还没有真正测试过这个)。
评论
如果是 Windows 排序规则,则归结为设置适当的区域设置和排序顺序,如排序顺序标识符,在 .Net 世界中,它采用当前设置的 UI 区域性。
如果是 SQL 排序规则,则稍微复杂一些。如果您使用 VARCHAR,则您将失去锁定。对于NVARCHAR来说,还是有一些希望的。请参阅将 SQL 排序规则与 Windows 排序规则进行比较:
SQL 排序规则的排序规则 非 Unicode 数据与 提供的任何排序例程 Microsoft Windows操作系统 系统;但是,排序 Unicode 数据与 特定版本的 Windows 排序规则。因为比较 非 Unicode 和 Unicode 数据的规则 是不同的,当你使用 SQL 您可能会看到不同的排序规则 相同结果的比较结果 字符,具体取决于 基础数据类型。例如,如果 您正在使用 SQL 排序规则 “SQL_Latin1_General_CP1_CI_AS”, 非 Unicode 字符串“a-c”小于 字符串“ab”,因为连字符 (“-”) 排序为单独的 “b”之前的字符。 但是,如果转换这些字符串 更改为 Unicode,然后您执行相同的操作 比较,Unicode 字符串 N'a-c' 被认为大于 N'ab' 因为 Unicode 排序规则使用 忽略连字符的“单词排序”。
为了您的目的(TDD),我建议您远离可疑字符,例如连字符,或者一个接两个(德语ss问题),或大写(土耳其语colliton问题),(西班牙语排序规则问题)等...坚持使用正确排序的一小部分字符,例如 .我是认真的。-
s
I
sh
a,A,b,B
评论
编写一个自定义实现,该实现实际上调用 SQL Server,以比较它被要求比较的两个值中的每一个。IComparer
它会很慢,有点傻,但它会完全按照你的要求去做。
或者,如果您只关心精确复制一个特定的排序规则序列,而不关心任何随机排序规则,则编写一个一次性例程来调用 SQL Server,并按照 SQL Server 放置字符的顺序生成所有字符的集合,并使用该集合来生成自定义实现,然后该实现将匹配 SQL Server 的序列,而无需在运行时调用 SQL Server。IComparer
评论