我使用的是Entity Framework 5和Sql Server 2008 R2(SP1)标准版。
我正在执行一些LINQ to Entity Framework代码,它们按照以下方式执行:
public Site GetSite(int siteId)
{
using (var context = new SystemContext())
{
return context.Site.Where(x => x.Id == siteId).FirstOrDefault();
}
}
现在我的理解是因为上面的siteId是一个变量,它将生成使用sp_executesql来参数化siteId的SQL。现在,大多数时候,它就是这样做的。
然而,使用SQL分析器,我可以看到它经常这样做:
SELECT TOP (1)
[Extent1].[id] AS [id],
[Extent1].[sitename] AS [sitename],
…truncated fields for sake of clarity
FROM [dbo].[Site] AS [Extent1]
WHERE [Extent1].[id] = @11
请注意,它不使用sp_executesql,它应该是。它还将网站的Id字段与' @ 11'进行比较。
11是LINQ表达式中siteId的实际值,因此它似乎在前面加上@ - 你希望生成的参数名称出现在这里,而不是变量的值在这里@ 字首。这恰恰引发了SQL错误:必须声明标量变量" @ 11"。
在我们的系统中,许多其他LINQ表达式也会发生这种情况,同样,它有时只会发生。有谁知道这会导致什么?谢谢!