C# 可以在实体框架中设置执行时间吗?

C# 可以在实体框架中设置执行时间吗?,c#,entity-framework,C#,Entity Framework,我有一个利用实体框架6的应用程序。对于相对快速的查询(例如,执行时间不到一分钟),它可以正常工作 但是我有一个存储过程,它查询一个没有适当索引的表,因此执行查询所需的时间被记录在55到63秒之间。显然,索引表格会缩短时间,但不幸的是,我没有控制局面的能力,不得不处理我的牌 我看到的是,当使用EF6调用存储过程时,它将在不到3秒的总时间内继续执行代码,并返回0条记录的结果;当我知道有6条记录时,存储过程将在数据库中直接执行时返回 没有任何错误,因此代码执行良好 进行测试;我使用SqlClient库

我有一个利用实体框架6的应用程序。对于相对快速的查询(例如,执行时间不到一分钟),它可以正常工作

但是我有一个存储过程,它查询一个没有适当索引的表,因此执行查询所需的时间被记录在55到63秒之间。显然,索引表格会缩短时间,但不幸的是,我没有控制局面的能力,不得不处理我的牌

我看到的是,当使用EF6调用存储过程时,它将在不到3秒的总时间内继续执行代码,并返回0条记录的结果;当我知道有6条记录时,存储过程将在数据库中直接执行时返回

没有任何错误,因此代码执行良好

进行测试;我使用SqlClient库构造了一些代码,并进行了相同的调用,它返回了6条记录。还注意到,与EF6执行不同,它实际上需要几秒钟的时间,就好像它实际上在等待接收响应一样

在上下文上设置CommandTimeout似乎也没有任何区别,我怀疑可能是因为它没有超时,而是没有等待结果,然后继续执行代码

我不记得在以前的版本中看到过这种行为,但也许执行以前的查询所需的时间在预期的EF???范围内

有没有办法设置EF在继续执行代码之前等待响应的实际时间?或者有没有一种方法可以强制执行异步操作,因为它在默认情况下似乎是一个默认的同步任务??或者代码中是否存在潜在缺陷

显示(同步)执行的代码示例:没有错误,但没有返回记录

public static List<Orphan> GetOrphanItems()
{
  try
    {
      using (var ctx = new DBEntities(_defaultConnection))
      {
         var orphanage =  from orp in ctx.GetQueueOrphans(null)
                          select orp;
         var orphans = orphanage.Select(o => new Orphan
                      {
                          ServiceQueueId = o.ServiceQueueID,
                          QueueStatus = o.QueueStatus,
                          OrphanCode = o.OrphanCode,
                          Status = o.Status,
                          EmailAddress = o.EmailAddress,
                          TemplateId = o.TemplateId
                      }).ToList();
         return orphans;
      }
    }
    catch(Exception exc)
    {
        // Handle the error
    }
}
公共静态列表getOrphandItems()
{
尝试
{
使用(var ctx=newdbentities(_defaultConnection))
{
var orphanage=来自ctx.getQueueOrphants中的orp(null)
选择orp;
var孤儿=孤儿院。选择(o=>新建孤儿院
{
ServiceQueueId=o.ServiceQueueId,
QueueStatus=o.QueueStatus,
OrphanCode=o.OrphanCode,
状态=o.状态,
EmailAddress=o.EmailAddress,
TemplateId=o.TemplateId
}).ToList();
遣返孤儿;
}
}
捕获(异常exc)
{
//处理错误
}
}
使用SqlClient库(异步)的示例代码执行时间稍长,但返回6条记录

public static List<Orphan> GetOrphanItems()
{
  long ServiceQueueId = 0;
  bool QueueStatus;
  var OrphanCode = String.Empty;
  DateTime Status;
  var EmailAddress = String.Empty;
  int TemplateId = 0;
  var orphans = new List<Orphan> ();
  SqlConnection conn = new SqlConnection(_defaultConnection);   
  try
    {   
      var cmdText = "EXEC dbo.GetQueueOrphans";
      SqlCommand cmd = new SqlCommand(cmdText, conn);
      conn.Open();
      SqlDataReader reader;
      reader = cmd.ExecuteReader();
      while(reader.Read())
        {
          long.TryParse(reader["ServiceQueueId"].ToString(), out ServiceQueueId);
          bool.TryParse(reader["QueueStatus"].ToString(), out QueueStatus);
          OrphanCode = reader["OrphanCode"].ToString();
          DateTime.TryParse(reader["Status"].ToString(), out Status);
          EmailAddress = reader["EmailAddress"].ToString();
          int.TryParse(reader["TemplateId"].ToString(), out TemplateId);

          orphans.Add(new Orphan { ServiceQueueId = ServiceQueueId, QueueStatus=QueueStatus, OrphanCode=OrphanCode,
          EmailAddress=EmailAddress, TemplateId=TemplateId});
        }
      conn.Close();
    catch(Exception exc)
    {
        // Handle the error
    }
    finally
    {
        conn.Close();
    }
}
公共静态列表getOrphandItems()
{
长ServiceQueueId=0;
布尔排队状态;
var=String.Empty;
日期时间状态;
var EmailAddress=String.Empty;
int TemplateId=0;
var=newlist();
SqlConnection conn=新的SqlConnection(_defaultConnection);
尝试
{   
var cmdText=“EXEC dbo.getqueue孤儿”;
SqlCommand cmd=新的SqlCommand(cmdText,conn);
conn.Open();
SqlDataReader;
reader=cmd.ExecuteReader();
while(reader.Read())
{
long.TryParse(读卡器[“ServiceQueueId”].ToString(),out-ServiceQueueId);
bool.TryParse(reader[“QueueStatus”].ToString(),out QueueStatus);
OrphanCode=读取器[“OrphanCode”].ToString();
DateTime.TryParse(reader[“Status”].ToString(),out Status);
EmailAddress=读卡器[“EmailAddress”]。ToString();
int.TryParse(reader[“TemplateId”].ToString(),out TemplateId);
添加(新的孤立项{ServiceQueueId=ServiceQueueId,QueueStatus=QueueStatus,孤立代码=OrphanCode,
EmailAddress=EmailAddress,TemplateId=TemplateId});
}
康涅狄格州关闭();
捕获(异常exc)
{
//处理错误
}
最后
{
康涅狄格州关闭();
}
}

检查执行方法的类型

private async void MyMethod()
{
db.executeProdecudeAsync(); 
}
忘记在async void方法中等待任务可能会导致描述的行为而没有任何IntelliSense警告。 修正:


或者只需使用
db.executeProdeCodeSync().Wait()
如果要在同步模式下运行。

是否在连接字符串中设置超时?我已经在连接字符串中以及直接在上下文中设置了超时。结果如下same@Mark,您确定使用相同的参数以相同的方式调用它吗?您是否运行了SQL Profiler来确保?@johnny5,我没有运行SQL Profiler但是我确实检查了上下文以确认连接、设置等都是正确的。过程不需要参数扫描您发布有关如何调用存储过程的代码我会尝试一下您的建议,并在尝试您的建议之前更新结果我注意到了我猜您指的是该过程的异步版本?如果我没有错的话;我的过程没有异步版本,因此.Wait()方法也不可用。我已经发布了一些示例代码。我想您已经了解了一些内容,但我不确定如何实现对该过程的异步调用。
  private async Task MyMethod()
  {
    await db.executeProdecudeAsync(); 
  }