Как сравнивать / приводить данные поля строк строки SQL в C # - PullRequest
9 голосов
/ 10 октября 2011

У меня есть две записи в моей ученической таблице с полем версии строки. Я создаю объект этой записи как студенческий класс в своем коде C #.

Мой вопрос:

  1. В каком типе данных, совместимом с C #, выполняется преобразование данных строки?
  2. Как сравнить версию строк двух записей и найти, какая из них является последней в C #?

Ответы [ 2 ]

13 голосов
/ 21 сентября 2013

Один из способов найти последнюю версию строки - использовать StructuralComparer

var r1 = new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00};
var r2 = new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xFF};

bool r1_is_newer = StructuralComparisons.StructuralComparer.Compare(r1, r2) > 0;

Преимущество структурных сравнений состоит в том, что они автоматически обрабатывают NULL s

Относительно использования BitConverter.Если вышеупомянутые байтовые массивы были преобразованы в UInt64 с использованием BitConverter, в результате вы получили бы очень большие числа, и сравнение не имеет смысла (поскольку изменение строки изменяется на единицу, преобразованное число uint64 изменяетсяпримерно на 2 ^ 56)

Если вы хотите наложить немного LINQ поверх него, чтобы сделать его более медленным, вы можете использовать

bool r1_is_newer = 
  Enumerable.Zip(r1, r2, (b1, b2) => new { b1, b2 })
  .SkipWhile(item => item.b1 == item.b2)
  .Take(1).Any(item => item.b1 > item.b2);
1 голос
/ 10 октября 2011

rowversion равно binary(8) и будет возвращено как byte[], если вы используете SqlCommand / SqlDataReader.Если вы используете EF 4.1, соответствующее свойство также будет byte[].

. Вы можете использовать BitConverter для преобразования в UInt64, а затем сравнить.Вы также можете вернуть преобразование строки как bigint из SQL Server, которое будет выглядеть как long в C #.В любом случае, большее значение было бы создано позже.

В моих собственных тестах я видел, что инверсия строк начинается с небольшого положительного значения (не 0).Если вы выполните приведение к bigint, вам придется подумать, что произойдет, когда оно достигнет 2^64.В моем случае мне не о чем беспокоиться.Если вы думаете, что это произойдет в вашей базе данных, то вам придется добавить логику для обработки этого в вашем сравнении или просто придерживаться BitConverter.ToUInt64.

Также будьте осторожны, если ваш столбец rowversion принимаетNULL;Вам придется учитывать это, если это произойдет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...