【发布时间】:2014-10-28 02:30:12
【问题描述】:
由于某种原因,我的代码无法运行。
from tan in TANS
where tan.ID.ToString().Count() != 1
select tan
我想选择表中所有重复的 ID,因此我使用 count != 1 并收到此错误。
NotSupportedException:“System.String”类型不支持序列运算符
请帮忙?
【问题讨论】:
标签: linq-to-sql
由于某种原因,我的代码无法运行。
from tan in TANS
where tan.ID.ToString().Count() != 1
select tan
我想选择表中所有重复的 ID,因此我使用 count != 1 并收到此错误。
NotSupportedException:“System.String”类型不支持序列运算符
请帮忙?
【问题讨论】:
标签: linq-to-sql
tan.ID.ToString() 是一个字符串,而不是一个集合,所以你不能应用 Count()。
我相信你想要这样的东西:(这个语法是错误的,但是很接近)
from tan in TANS
group tan by tan.ID into dups
where dups.Count() > 1
select dups.Key;
更新(5 年后减去 5 天):(谷歌一个问题并找到你写的答案有点奇怪..)这个问题的核心是 LINQ 语句试图构建一个 SQL 语句,并且数据库不知道如何将 Count() 应用于字符串。但是,如果您对内存中的集合使用 LINQ,那么它会将字符串视为 IEnumerable,并且 Count() 可以正常工作。
【讨论】:
如果您只想让 ID 本身的价值与他的一致,那么詹姆斯的回答与我认为您想要的很接近。如果您想要分配 ID 的对象,请尝试此操作。
var dupes = (from tan in TANS
group tan by tan.ID.ToString() into duplicates
where duplicates.Count() > 1
select duplicates.Select(d => d)).SelectMany(d => d);
我敢肯定,这不是 LINQ 中最干净的方法。如果我想出一种更清洁的方法,我会在这里进行编辑。 SelectMany 很重要,因为它将 IGrouping 中的对象列表展平。
【讨论】: