分组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将它们存储为问号。仍然不确定这是一个重复的问题,因为它与后面的空格没有任何关系。

分组Linq到Sql vs. Linq到对象

您得到的错误不是当分组,而是当插入数据到您的表。请参考这个答案:唯一索引,varchar列和(空白)空格的行为,您将看到,您不能将数据插入到具有唯一索引的列中,只有末尾空格不同。