Как сортировать в .NET так же, как сортировка SQL Server? - PullRequest
6 голосов
/ 07 января 2011

Я делал некоторые TDD против некоторых существующих хранимых процедур. Они возвращают XML, поэтому я использую LINQ to XML.

В данный момент я работаю над тестом, который докажет, что данные были отсортированы правильно. Тест перемещается по XML и создает IEnumerable анонимного типа, содержащий три столбца, которые должны быть отсортированы. Исходя из этого, он создает второй IEnumerable путем сортировки первого:

var sortedColumns = from g in columns
                    orderby g.ColumnA ascending,
                            g.ColumnB ascending,
                            g.ColumnC ascending
                    select g;

Наконец, он утверждает, что отсортированные столбцы такие же, как и несортированные столбцы, использующие SequenceEquals.

Проблема возникает, когда сопоставление базы данных отличается от текущего сопоставления. В частности, .NET помещает "W-" перед "Wa" в столбце B.

Есть ли способ сортировки в том же порядке, что и произвольная сортировка SQL Server? Если нет, то как бы отсортировать в том же порядке, что и SQL_Latin1_General_CP1_CI_AS?

Ответы [ 4 ]

4 голосов
/ 07 января 2011

Если это сопоставление Windows, то оно сводится к установке соответствующего языкового стандарта и порядка сортировки, как в идентификаторах порядка сортировки , что в мире .Net соответствует текущей установленной культуре пользовательского интерфейса.

Если это сортировка SQL, то это немного сложнее. Если вы используете VARCHAR, вы находитесь вне замка. Для NVARCHAR есть некоторая надежда. См. Сравнение сопоставлений SQL с сопоставлениями Windows :

Правила сортировки SQL для сортировки данные не в Юникоде несовместимы с любая сортировка, предоставляемая операционная система Microsoft Windows система; однако сортировка Данные Unicode совместимы с конкретная версия Windows правила сортировки. Потому что сравнение правила для не-Unicode и Unicode данных разные, когда вы используете SQL сопоставление вы можете увидеть разные результаты для сравнения того же символы, в зависимости от базовый тип данных. Например, если вы используете сортировку SQL «SQL_Latin1_General_CP1_CI_AS», не-Unicode строка 'a-c' меньше чем строка «ab», потому что дефис ("-") сортируется как отдельный символ, который предшествует "б". Однако, если вы конвертируете эти строки Unicode и вы делаете то же самое сравнение, строка Unicode N'a-c ' считается больше, чем N'ab ' потому что правила сортировки Unicode используют «сортировка слов», которая игнорирует дефис.

Для ваших целей (TDD) я бы порекомендовал просто держаться подальше от подозрительных символов, таких как дефис -, или иметь два s один за другим (немецкие проблемы ss) или заглавные I (турецкие коллитоны) , sh (проблемы сортировки по-испански) и т. Д. И т. П. ... Придерживайтесь небольшого набора символов, которые сортируются правильно, например a,A,b,B. Я серьезно.

1 голос
/ 18 февраля 2011

Напишите специальную IComparer реализацию, которая на самом деле вызывает SQL-сервер для сравнения каждого из двух значений, которые его просят сравнить.

Это будет очень медленно, немного глупо, но будет точното, что вы спрашиваете.

Или, если вам нужна точная репликация только одной конкретной последовательности сопоставления, а не случайное сопоставление, напишите одноразовую подпрограмму для вызова SQL Server и создания коллекции.из всех символов в том порядке, в котором SQL-сервер будет помещать их и использовать для создания пользовательской реализации IComparer, которая будет соответствовать последовательности SQL-сервера без вызова SQL-сервера во время выполнения.

0 голосов
/ 07 января 2011

Я поднял это с use-own-icomparert-with-linq-orderby .

        MyComparer comparer = new MyComparer();
        items = items.OrderByDescending(
                  x => property.GetValue(x), comparer).ToList();
        break;

Вы можете создать собственный компаратор для своих нужд.(Вам может понадобиться конкретный тип вместо анонимного типа для ваших результатов - я на самом деле не проверял это).

0 голосов
/ 07 января 2011

LINQ-to-SQL не поддерживает прямое использование параметров сортировки. Если вы хотите выполнить специальную сортировку, вам придется получать данные локально, преобразовывать их в список (или что-то еще) и сортировать их самостоятельно.

Для дальнейшего ознакомления см. Следующие две ссылки:

...