上下文中的标量命令.Database.SqlQuery <double?> vs Management Studio中的SQL </double?>

时间:2014-08-06 14:46:39

标签: c# sql entity-framework

我有一个从EF 6.1上下文运行的脚本:

using (var context = new Entities())
{
    context.Database.CommandTimeout = 120;
    var result  = context.Database.SqlQuery<double?>(
        sqlCommandString,
        new SqlParameter("since", since),
        new SqlParameter("until", until),
        new SqlParameter("p", p)
        ).FirstOrDefault();
}

我注意到如果我使用完全相同的参数在Management Studio中运行脚本,它的执行时间为40毫秒,而使用上面的代码在控制台应用程序中运行它,则会抛出超时异常。

连接字符串是正确的,其他脚本运行正常(较慢但至少返回)。

我错过了什么?是否有另一种使用EF执行标量命令而不实际映射存储过程的方法?

1 个答案:

答案 0 :(得分:0)

直接从代码执行SQL时,请检查脚本中的选项卡和空格。

如果代码是多行的并且您保持缩进,则使用该命令发送所有选项卡和空格。从EF运行代码将其包装在sp_executesql中,并且所有选项卡和空格都会变得混乱。

<强>为

if(true)
{
    if(true)
    {
        string sqlCommand = @"
            SELECT * FROM (
                SELECT * FROM tblA
            ) A
        ";
    }
}

不可

if(true)
{
    if(true)
    {
        string sqlCommand = 
@"
SELECT * FROM (
    SELECT * FROM tblA
) A
";
    }
}