Entity framework 为什么';使用参数时,我不喜欢语句筛选器

Entity framework 为什么';使用参数时,我不喜欢语句筛选器,entity-framework,tsql,sql-like,Entity Framework,Tsql,Sql Like,在带有嵌入“%”字符的查询中使用LIKE子句时,查询不会返回预期的行。但如果我使用常量字符串,它将按预期工作。这只会在我使用StartsWith(如“x%”)而不是Contains(如“%x%”)时导致问题 我做错了什么 复制代码(最终查询是意外的): 环境:实体框架5根据SQL Server 2012 SP1生成的SQL。检查SQL 2000和2008R2 SP2上是否出现相同的行为。在代码末尾添加以下内容: print @p__linq__StartsWith 结果解释了意外的结果。现在请

在带有嵌入“%”字符的查询中使用LIKE子句时,查询不会返回预期的行。但如果我使用常量字符串,它将按预期工作。这只会在我使用StartsWith(
如“x%”
)而不是Contains(
如“%x%”
)时导致问题

我做错了什么

复制代码(最终查询是意外的):


环境:实体框架5根据SQL Server 2012 SP1生成的SQL。检查SQL 2000和2008R2 SP2上是否出现相同的行为。

在代码末尾添加以下内容:

print @p__linq__StartsWith
结果解释了意外的结果。现在请尝试以下代码:

DECLARE @p__linq__StartsWith nvarchar(5)
SET @p__linq__StartsWith = N'm%'
DECLARE @p__linq__Contains nvarchar(5)
SET @p__linq__Contains = N'%m%'

-- OK: Returns "Me" and "Not Me"
SELECT * FROM (SELECT N'Me' AS F UNION ALL SELECT N'Not Me' AS F) x
WHERE f LIKE N'%m%'

-- OK: Returns "Me"
SELECT * FROM (SELECT N'Me' AS F UNION ALL SELECT N'Not Me' AS F) x
WHERE f LIKE N'm%'

-- OK: Returns "Me" and "Not Me"
SELECT * FROM (SELECT N'Me' AS F UNION ALL SELECT N'Not Me' AS F) x
WHERE f LIKE @p__linq__Contains

-- Unexpected: Returns nothing
-- And why doesn't the last query do the same thing???
SELECT * FROM  (SELECT N'Me' AS F UNION ALL SELECT N'Not Me' AS F) x
WHERE f LIKE @p__linq__StartsWith

print @p__linq__StartsWith
您只需指定nvarchar的长度即可解决此问题


我在BOL中找到了一个解释。请看第一句话。

因此,如果未指定,SQL Server假定(n)varchar上的长度为1。您有关于此假定的参考吗?声明@a nvarchar select@a=n'hello world'select@aSorry,无参考,仅根据您的答案进行观察。你之前的评论很好地说明了这种行为。
DECLARE @p__linq__StartsWith nvarchar(5)
SET @p__linq__StartsWith = N'm%'
DECLARE @p__linq__Contains nvarchar(5)
SET @p__linq__Contains = N'%m%'

-- OK: Returns "Me" and "Not Me"
SELECT * FROM (SELECT N'Me' AS F UNION ALL SELECT N'Not Me' AS F) x
WHERE f LIKE N'%m%'

-- OK: Returns "Me"
SELECT * FROM (SELECT N'Me' AS F UNION ALL SELECT N'Not Me' AS F) x
WHERE f LIKE N'm%'

-- OK: Returns "Me" and "Not Me"
SELECT * FROM (SELECT N'Me' AS F UNION ALL SELECT N'Not Me' AS F) x
WHERE f LIKE @p__linq__Contains

-- Unexpected: Returns nothing
-- And why doesn't the last query do the same thing???
SELECT * FROM  (SELECT N'Me' AS F UNION ALL SELECT N'Not Me' AS F) x
WHERE f LIKE @p__linq__StartsWith

print @p__linq__StartsWith