分组Linq到Sql vs. Linq到对象
本文关键字:Linq 对象 vs Sql 分组 | 更新日期: 2023-09-27 18:11:21
我有一个SQL Server 2008表:
CREATE TABLE [dbo].[Pages](
[Id] [uniqueidentifier] NOT NULL,
[PageName] varchar(400) NOT NULL,
[Count] int NOT NULL,
CONSTRAINT [PK_Pages] PRIMARY KEY CLUSTERED
(
[Id] ASC
)) ON [PRIMARY]
和表上的唯一索引:
CREATE UNIQUE NONCLUSTERED INDEX [IX_PageName] ON [dbo].[Pages]
(
[PageName] ASC
)
我从一个文本文件中得到一堆页面名称,我在Linq中分组并计算出现次数。
var data = pages.GroupBy(x => x.PageName.ToLower().Trim())
.Select(x => new Page()
{
Id = Guid.NewGuid(),
PageName = x.Key,
Count = x.Count(),
})
.ToList();
我知道Linq中对对象的分组与Ling到Sql的分组不同,因为IEnumerable分组是区分大小写的,而T-SQL中的索引忽略了varchar末尾的空白。这就是为什么我用上面的ToLower()
和Trim()
进行分组,但索引异常仍然会触发。我在文本文件中的页面名称中有很多非alpha字符(正斜杠,反斜杠,逗号,点等),但我无法找出哪些是导致异常的。
这是我在调试时得到的异常。
Cannot insert duplicate key row in object 'dbo.Pages' with unique index 'IX_PageName'.
The statement has been terminated.
解决方案:
感谢@Panagiotis Kanavos,我用Sql分析器解决了这个问题。有几个字符串的中间有亚洲字母,例如嘊,我的排序SQL_Latin1_General_CP1_CI_AS将它们存储为问号。仍然不确定这是一个重复的问题,因为它与后面的空格没有任何关系。
您得到的错误不是当分组,而是当插入数据到您的表。请参考这个答案:唯一索引,varchar列和(空白)空格的行为,您将看到,您不能将数据插入到具有唯一索引的列中,只有末尾空格不同。