【问题标题】:The text data type cannot be selected as DISTINCT because it is not comparable. Not doing distinct operation文本数据类型不能选择为 DISTINCT,因为它不可比较。不做不同的操作
【发布时间】:2015-04-17 01:00:32
【问题描述】:

在 SQL Server 表中,“问题”列之一的数据类型为“文本”。

现在,当我在 sql 中进行查询时,使用强制转换为 varchar。

现在,在 linq 中,以下是检索特定结果数据的查询。

问题是,当我尝试在FORFOREACH 循环中迭代结果集时,它给了我以下错误。我用谷歌搜索了,但它说,当做不同但我没有做不同的操作时会发生这种情况。

The text data type cannot be selected as DISTINCT because it is not comparable

from t in db.Table
group t by new 
          {
           t.Category, 
           t.Question
          } into g
order by g.Category
select new 
{
  CategoryName = t.FirstOrDefault().Category, //might be required to handle null here
  Question = t.FirstOrDefault().Question, //might be required to handle null here
  TotalCount = t.Count(),
  AnsLessEqual3 = t.Where(d => d.Answer<=3).Count(),
  Ans5 = t.Where(d => d.Answer = 5).Count(),
  Ans789 = t.Where(d => d.Answer = 7 || d.Answer = 8 || d.Answer =     9).Count()
 }

请指导如何解决此问题。

【问题讨论】:

  • GROUP BY 的工作方式类似于 DISTINCT。我假设您的 group 表达式之一是 TEXT 数据类型 - Question 最有意义。是否有一个您可以分组的非文本字段(问题 ID?)?
  • 是的,“question”是group by子句和select子句中的字段。
  • 然后我会重新排列您的查询,这样您就不会按文本字段进行分组。
  • 你能做到吗?我需要可以通过上述查询得到的相同结果。
  • 我对 linq 一无所知,你是不是某个地方的 select 语句?

标签: c# sql-server linq


【解决方案1】:

您必须让 LINQ 将您的文本字段转换为 varchar,抓取整个子字符串应该可以解决问题。此外,您应该坚持自己的小组,否则您将总结整个表格,假设 LINQ 允许这样做。

from t in db.Table
group t by new 
          {
           Category = t.Category.Substring(0), 
           t.Question
          } into g
orderby g.Key.Category
select new 
{
    CategoryName = g.Key.Category,
    Question = g.Key.Question,
    TotalCount = g.Count(),
    AnsLessEqual3 = g.Count(d => d.Answer <= 3),
    Ans5 = g.Count(d => d.Answer = 5),
    Ans789 = g.Count(d => d.Answer = 7 || d.Answer = 8 || d.Answer = 9)
 }

【讨论】:

  • 如何在 linq 中将文本转换为字符串。
  • 如何在 linq 中将文本转换为字符串。我的意思是,我如何应用子字符串来获取数据并使其成为字符串。如果你能举个例子,它会有所帮助。
  • Category = t.Category.Substring(0) group 子句中的诀窍是什么,我的其余更改是清理。你有机会尝试吗?
【解决方案2】:

文本数据类型自 2005 年以来已被弃用。您不应使用它。工作很痛苦。您应该改用 varchar(max)。我建议您将表改为 varchar(max)。

【讨论】:

  • 是的,但现在,它不是我的手了。由客户管理。我需要在这里找到一些替代方案。这是现有的数据库。
  • 数据库当然存在。使用 varchar(max) 代替文本是一个简单的 alter 语句。我已经做了很多次了,完全没有数据丢失。
  • 是的,这是真的。但是,不是在我的手中,因为它在客户端控制中。现在,我需要在 linq 或 for 循环中找到解决方案,其中会出现此异常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多