LINQ to Entity SQLFunction.String Convert 返回 varchar 而不是 nvarchar

3

我需要编写Linq查询来连接两个表,这两个表的相关字段类型不同,一个是字符串(nvarchar),另一个是整数。

以下是我的Linq查询:

from je in a
join vP in b
on je.BaseRef  equals SqlFunctions.StringConvert((decimal) vP.DocEntry)

在SQL中使用LINQ的结果是:

SELECT 
[Extent1].[Account] AS [Account]
FROM  [dbo].[a] AS [Extent1]
JOIN [dbo].[b] AS [Extent2] ON ([Extent1].[BaseRef] = (STR( CAST( [Extent2].[DocEntry] AS float)))) OR (([Extent1].[BaseRef] IS NULL) AND (STR( CAST( [Extent2].[DocEntry] AS float)) IS NULL))

查询返回 null,是因为sql无法比较 varchar 和 nvarchar。 linq to entity 将 sqlfunction.stringFormat 翻译为 str('') 而不是 convert(nvarchar,'')。 我如何将其转换为 nvarchar?

1个回答

4

有一个解决办法:

SqlFunctions.StringConvert((decimal) vP.DocEntry) + ""

这将被翻译为

(STR( CAST( [Extent2].[DocEntry] AS float))) + N''

将整个表达式转换为nvarchar

但我怀疑charnvarchar之间的比较不应该是一个问题。更可能的解决方法是修剪转换结果:

SqlFunctions.StringConvert((decimal) vP.DocEntry).Trim()

你好,感谢您的回复。我尝试了一下,但它返回了 varchar 类型。 - Miri Dzimi
嗨Gert,我试过了,使用trim()也是一样的结果。SQL无法比较nvarchar和varchar,SQL可以比较int和string而不需要转换,但是在这种情况下,Linq to Entity无法通过构建。 - Miri Dzimi
1
Char和nvarchar应该可以很好地进行比较。尝试使用SELECT CASE WHEN N'b' = CAST('b' AS char) THEN 1 ELSE 0 END(输出:1)。这一定是其他问题。也许您应该展示一些样本数据(包括“BaseRef”和“DocEntry”)。 - Gert Arnold
当我运行从linq获取的查询时: - Miri Dzimi
当我运行上面的linq时,我没有得到任何结果,但是当我运行查询时,没有将整数转换为字符串:"SELECT [Extent1].[Account] AS [Account] FROM [dbo].[a] AS [Extent1] JOIN [dbo].[b] AS [Extent2] ON ([Extent1].[BaseRef] = [Extent2].[DocEntry]) OR (([Extent1].[BaseRef] IS NULL) AND (STR(CAST([Extent2].[DocEntry] AS float)) IS NULL))"(SQL中允许比较nvarchar和int),我得到了2900个结果。 - Miri Dzimi
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接