我在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中执行此操作非常简单。
答案 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)。