Ошибка фильтра Linq, связанная с полем varchar (1) - PullRequest
1 голос
/ 20 января 2010

В моей базе данных есть поле varchar (1). Мне не разрешено это менять. Единственные значения для этого поля: 0 или 1.

Вот предложение where запроса linq:

where
g.id_Group == idGroup &&
a.AccountOpen.Value == '1'

Мой запрос linq сгенерировал следующий sql where clause

WHERE ([t1].[id_Group] = 1234) AND (UNICODE([t0].[AccountOpen]) = '1')

AccountOpen - это поле varchar (1).

Я изменил предложение where на это вручную

WHERE ([t1].[id_Group] = 1234) AND ([t0].[AccountOpen] = '1')

Второй запрос возвращает строки данных, а первый - нет. Как я могу заставить это работать БЕЗ изменения схемы базы данных?

Ответы [ 3 ]

2 голосов
/ 21 января 2010

Конструктор VS2008 L2S неправильно отображает varchar (1) и nvarchar (1) в System.Char. (см. http://social.msdn.microsoft.com/Forums/en/linqtosql/thread/ac91e587-6e91-454c-9fa2-bab20b7a258c)

Вы можете изменить отображение для ваших столбцов [n] varchar (1) в конструкторе L2S, чтобы вместо этого оно отображалось на строку. Таким образом, вы можете выполнять обычные сравнения строк, а также не получите исключений при материализации записей, содержащих пустые [n] varchar (1) s.

1 голос
/ 21 января 2010

Вы пытались использовать string вместо char для сравнения?

where 
g.id_Group == idGroup && 
a.AccountOpen.Value == "1"
0 голосов
/ 21 января 2010

Это потому, что функция UNICODE ():

Возвращает целочисленное значение, как определено по стандарту Unicode, для первого символ входного выражения

Так, если поле AccountOpen содержит значение «1», значение UNICODE () для этого будет 49 ..., поэтому оно не удовлетворяет условию поиска (49 <> '1')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...