У меня есть таблица в SQL Server 2008:Группировка Linq к Sql по сравнению с Linq к объектам
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()
выше, но исключение индекса по-прежнему срабатывает. В именах страниц в текстовом файле у меня много не-альфа-карахтеров (косые черты, обратные косые черты, запятые, точки и т. Д.), Но я не могу понять, какие из них вызывают исключение.
EDIT:
Вот исключение я получаю при отладке.
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 сохранила их как вопросительные знаки. Все еще не уверен, что это был дублированный вопрос, поскольку он не имел никакого отношения к завершающим пробелам.
Итак, какое исключение вы действительно получаете, когда пытаетесь вставить 'data'? Как вы можете видеть из вашего примера, уникальное нарушение индекса на самом деле говорит вам о ошибочном значении! – Jamiec
@Jamiec отредактировал мой пост с исключением, в visual studio я не получаю это значение в исключении. В SQL-сервере я получаю значение. – Alex
Стандарт SQL требует заполнения строк до их определенной длины перед сравнением, поэтому два значения PageName считаются равными SQL Server. Либо избегайте смешивания заполненных имен, либо замените конечные пробелы каким-либо другим символом (уродливым). –