Linq过滤器涉及varchar(1)字段的问题

时间:2010-01-20 20:58:14

标签: c# sql-server linq-to-sql unicode

我的数据库中有一个varchar(1)字段。我不允许改变它。该字段的唯一值为0或1.

这是linq查询的where子句:

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

我的linq查询生成了以下sql where子句

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

'AccountOpen'是varchar(1)字段。

我手动将where子句改为此

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

第二个查询返回数据行而第一个查询不返回。如何在不更改数据库架构的情况下使其工作?

3 个答案:

答案 0 :(得分:2)

VS2008 L2S设计器错误地将varchar(1)和nvarchar(1)映射到System.Char。 (见http://social.msdn.microsoft.com/Forums/en/linqtosql/thread/ac91e587-6e91-454c-9fa2-bab20b7a258c

您可以更改L2S设计器的[n] varchar(1)列的映射,以便将其映射到字符串。这样,您可以进行正常的字符串比较,并且在实现包含空[n] varchar(1)s的记录时也不会出现异常。

答案 1 :(得分:1)

您是否尝试使用string代替char进行比较?

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

答案 2 :(得分:0)

这是因为UNICODE()函数:

  

返回定义的整数值   按照Unicode标准,第一个   输入表达式的字符

因此,如果AccountOpen字段包含值“1”,则其UNICODE()值为49 ...因此它不满足搜索条件(49<>'1')