无法在C#和LINQ中将Distinct函数与NTEXT字段一起使用

时间:2018-08-30 16:38:00

标签: c# sql-server entity-framework linq

我在NTEXT类型的表中有一个名为Description的字段。我的问题是,我需要使用方法.Distinct(),但不能使用“由于无法比较ntext数据类型不能选择为DISTINCT”。

还有一个与此here非常相似的问题,但是被接受的解决方案对我不起作用。尝试时,出现新错误,提示“参数数据类型ntext对于len函数的参数1无效。”

下面是我最初使用的Linq语句,下面是我在阅读other similar question的答案后尝试执行的语句。

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();

除了转换字段外,是否有人对如何解决此限制有任何想法?谢谢!

我很清楚,自2005年以来,NTEXT,TEXT和IMAGE均已弃用,但由于无法访问,我目前无法更改该字段的类型。

我也很清楚不能将NTEXT,TEXT和IMAGE设为DISTINCT。我想弄清楚LINQ中的解决方法。在SQL中执行此操作非常简单。

2 个答案:

答案 0 :(得分:1)

我正在写下您尝试比较的方式

第一 尝试使用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;
}

答案 1 :(得分:0)

基本问题是使用DISTINCT的SELECT中不允许TEXT,NTEXT和IMAGE数据字段。 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)。