在一个非常简单的数据库查询中:
_service.GetAll<Visitor>().Any(r => r.EmailAddress == email)
使用Glimpse跟踪它时,它会显示传递给数据库的类型@p__linq__0
和大小String
的参数4000
。生成以下SQL:
SELECT
CASE WHEN ( EXISTS (SELECT
1 AS [C1]
FROM [dbo].[Visitor] AS [Extent1]
INNER JOIN [dbo].[VisitorType] AS [Extent2] ON [Extent1].[Id] = [Extent2].[Id]
WHERE ([Extent2].[EmailAddress] = 'test@test.com' /* @p__linq__0 */) OR (([Extent2].[EmailAddress] IS NULL) AND ('test@test.com' /* @p__linq__0 */ IS NULL))
)) THEN cast(1 as bit) ELSE cast(0 as bit) END AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable1]
当MaxLength为254时,这似乎非常浪费。
任何人都能解释为什么会这样吗?以及如何更改参数大小?
更新
以下类似的问题也没有提供有关如何更改此默认行为的解决方案: Why does code first/EF use 'nvarchar(4000)' for strings in the raw SQL command?
从数据库优化的角度来看,这是有道理的,但是当尝试减少在慢速网络环境中传输到移动客户端的数据量时,将每个字符串参数增加到4000字节是没有意义的。 / p>