Не могу использовать функцию Distinct с полем NTEXT в C # и LINQ - PullRequest
0 голосов
/ 30 августа 2018

У меня есть поле с именем Description в таблице типа NTEXT. Моя проблема заключается в том, что мне нужно использовать метод .Distinct (), но я не могу сделать так: «Тип данных ntext не может быть выбран как DISTINCT, потому что он несопоставим».

Есть еще один вопрос, очень похожий на найденный здесь , но принятое решение не работает для меня. Когда я пытаюсь это сделать, я получаю новую ошибку, в которой говорится: «Тип данных аргумента ntext недопустим для аргумента 1 функции len».

Ниже приведено утверждение Linq, которое я делал изначально, а нижеприведенное - то, что я пытался сделать после прочтения ответа на другой аналогичный вопрос .

return (from vl in db.ValueLog
        join vc in db.ValueCodes on vl.ValueCode equals vc.ValueCode
        select new ValueLogItem
        {
            ValueId = vl.ValueId ,
            Description = vl.Description.Substring(0),
            Quantity = vl.Quantity,
            Code = vc.ValueCode
        }).Distinct().ToList();

У кого-нибудь есть идеи о том, как обойти это ограничение, кроме простой конвертации поля? Спасибо!

Мне хорошо известно, что NTEXT, TEXT и IMAGE устарели с 2005 года, но в настоящий момент я не могу изменить тип поля, поскольку у меня нет доступа для этого.

Мне также хорошо известно, что NTEXT, TEXT и IMAGE нельзя сделать DISTINCT. Я пытаюсь найти обходной путь в LINQ. Делать это в SQL очень просто.

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Я пишу, как вы можете попытаться сравнить

Первый Попробуйте GroupBy вместо Distinct. GroupBY работает аналогично

Второй Преобразуйте описание в байтовый массив и сравните массивы. Для этого вы можете использовать

static bool ByteArrayCompare(byte[] a1, byte[] a2) 
{
    return StructuralComparisons.StructuralEqualityComparer.Equals(a1, a2);
}

или

return a1.SequenceEqual(b1);

или

public bool Equality(byte[] a1, byte[] b1)
{
   int i;
   if (a1.Length == b1.Length)
   {
      i = 0;
      while (i < a1.Length && (a1[i]==b1[i])) //Earlier it was a1[i]!=b1[i]
      {
          i++;
      }
      if (i == a1.Length)
      {
          return true;
      }
   }

   return false;
}
0 голосов
/ 30 августа 2018

Основная проблема заключается в том, что поля данных TEXT, NTEXT и IMAGE не допускаются в SELECT с использованием DISTINCT. В частности, одна из ошибок SQL Server гласит:

Server: Msg 421, Level 16, State 1, Line 1
The text/ntext/image data type cannot be selected 
as DISTINCT because it is not comparable.

Если вы не можете изменить тип данных, вы не сможете использовать DISTINCT в этом поле. Итак, CAST / CONVERT текстовое поле VARCHAR (MAX) на лету, если вы не можете изменить базовый тип данных.

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