我正在为WinForms应用程序编写查询管理器,除其他外,它需要能够在用户输入查询时向用户提供实时搜索结果(想想Google的实时结果,尽管很明显在厚客户端环境而不是Web).由于结果需要在用户输入时开始到达,搜索将变得越来越具体,所以我希望能够在用户输入更具体的信息时仍然执行时取消查询(因为结果会无论如何,只是被丢弃).
如果这是普通的ADO.NET,我显然可以使用该DbCommand.Cancel函数并完成它,但我们使用EF4进行数据访问,并且似乎没有明显的方法来取消查询.另外,在Reflector中打开System.Data.Entity并查看EntityCommand.Cancel显示一个令人沮丧的空方法体,尽管文档声称调用它会将其传递给提供者命令的相应Cancel函数.
我已经考虑过简单地让现有的查询运行并启动一个新的上下文来执行新的搜索(一旦完成就处理现有的查询),但我不喜欢单个客户端有多个开放的想法当我只对最近的结果感兴趣时,运行并行查询的数据库连接.
所有这一切都让我相信,一旦将EF查询分派到数据库中就没有办法取消EF查询,但是我希望这里的某个人能够指出我忽略的东西.
TL/DR版本:是否可以取消当前正在执行的EF4查询?
假设您已从代码中执行以下(长时间运行)过程:
int processID = DB.Execute(SQL); //some long running sql statement
Run Code Online (Sandbox Code Playgroud)
有没有办法以编程方式调用SQL Server取消进程,如果它花了太长时间(有点像在QueryAnalyzer中点击"停止"按钮)?
//cancel the process if it is taking too long
DB.Execute("sp_CancelProcess @ProcessID=" + processID);
Run Code Online (Sandbox Code Playgroud)