2016-10-04 2 views
0

У меня есть таблица в 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 сохранила их как вопросительные знаки. Все еще не уверен, что это был дублированный вопрос, поскольку он не имел никакого отношения к завершающим пробелам.

+0

Итак, какое исключение вы действительно получаете, когда пытаетесь вставить 'data'? Как вы можете видеть из вашего примера, уникальное нарушение индекса на самом деле говорит вам о ошибочном значении! – Jamiec

+0

@Jamiec отредактировал мой пост с исключением, в visual studio я не получаю это значение в исключении. В SQL-сервере я получаю значение. – Alex

+0

Стандарт SQL требует заполнения строк до их определенной длины перед сравнением, поэтому два значения PageName считаются равными SQL Server. Либо избегайте смешивания заполненных имен, либо замените конечные пробелы каким-либо другим символом (уродливым). –

ответ

-1

Вы получаете ошибки не при группировке, а при вставке данных в таблицу. Пожалуйста, обратитесь к этому ответу: Behavior of unique index, varchar column and (blank) spaces, и вы увидите, что вы не можете вставлять данные в столбец с уникальным индексом, который отличается только конечными пробелами.

+0

извините, если я не понял, это был просто пример того, что я получу ошибку, если я не сделаю Trim(), но я делаю Trim() в группировке. – Alex

Смежные вопросы