实体框架5生成的参数化Sql有时对于相同的LINQ查询不正确

时间:2014-10-08 15:29:37

标签: linq-to-entities entity-framework-5

我使用的是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表达式也会发生这种情况,同样,它有时只会发生。有谁知道这会导致什么?谢谢!

0 个答案:

没有答案