2016-03-07 157 views
0

我试图提取MVC中的SQL服务器视图的结果。视图本身相对简单,UNION将几个表联系在一起 - 运行时大约需要2秒才能返回其行。我在MVC中将视图添加到我的模型中。MVC:超时问题

在我的控制,我有以下的代码,其目的是JSON格式返回从SQL视图中的值: -

public JsonResult GetActivity(string LocalIdentifier) 
{ 
    return Json(db.Activities.Where(r => r.LocalIdentifier== LocalIdentifier).ToList(), JsonRequestBehavior.AllowGet); 
} 

当我尝试运行此,提供有效的LocalIdentifier什么也没发生的一段时间,然后在Visual Studio中出现异常(在用户代码中未处理)。作为参考,这通常只会返回30到50行SQL数据。

望着内部异常我得到这个错误: -

“超时时间已超时时间已过之前,操作完成或服务器没有响应。”

我在我的应用程序的其他地方做过类似的事情,它工作正常 - 我看不出MVC中的代码有什么问题。有什么我可以看看帮助诊断和解决这个问题?

更新

有趣的是,我只是改变了代码只提取一行(只是为了看看会发生什么 - 见下文),它运行瞬间......难道这是用ToList问题() ??有没有另外一种方法可以实现我想要做的事情?

public JsonResult GetActivity(string LocalIdentifier) 
{ 
    return Json(db.Activities.First(r => r.LocalIdentifier== LocalIdentifier), JsonRequestBehavior.AllowGet); 
} 
+1

是您的数据库服务器r esponding? – Sherlock

+0

是的...... db已启动并正在运行,并与我的其他应用程序一起工作。 –

+0

因为它返回一个json格式,你是否设置了服务器授权?它可能是函数的调用者不授权调用该函数 – Sherlock

回答

0

你应该尝试直接在sql server上运行结果查询。我预计查询会运行超过30秒,导致超时。默认超时值是30秒,因此您所看到的行为是预期的。

2种方式来对付它:

  • 加快查询(也许你错过了一个指数?)
  • 改变默认的超时(但这不是在我看来更好的选择)
+0

如果应用程序和数据库位于不同的服务器,我认为:)如果他在SQL方面查询,只需要2s完成 – Sherlock

+0

查询字面上需要2秒运行,如我原来的问题所述...我以前增加超时只是为了看看会发生什么,但没有任何变化(除了等待,直到我得到错误) –

+0

@MatRichardson是你在数据库端的空LocalIdentifier?我读过比较不可空标量和可空的需要时间来完成 – Sherlock

0

这取决于如何定义db.Activities。如果它具有其他实体的属性(即数据库中的其他表),那么即使您没有明确指定,也可以通过EF加载这些属性,因为JSON会序列化其每个对象的属性。你的数据库的一半或更多可能最终被加载,即使从这样一个简单的语句。

This SO question有几个答案,可以帮助你更好地了解幕后发生的事情,然后修复它。

0
  1. 启用profiling和查看查询里面
  2. 启动在SSMS此查询,并建立了query execution plan
  3. 分析计划,并更新到数据库 - 改变结构,建立索引,更改查询

如果查询在数据库中运行良好,那么您的ORM部分看起来有点问题,您应该搜索那里的问题