问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Entity Framework执行SQL怎么要多一个参数

发布网友 发布时间:2022-04-30 20:33

我来回答

2个回答

懂视网 时间:2022-05-01 00:55

SQL性能判断指标

那么问题来了,我们该如何正确这个时间呢?此问题又可以细分为两个步骤。

(1)如何知道SQL命令是正在执行时以及执行完成呢?

(2)知道了之后我们又如何设置以及获取时间呢?

我们一一来划分,首先我建立一个类 SQLProfiler ,而此类肯定是继承于 DbCommandInterceptor ,所以代码就变成了这样。

 public class SQLProfiler : DbCommandInterceptor
 {
 public override void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
 {
  Executing(interceptionContext);
  base.ReaderExecuting(command, interceptionContext);
 }

 public override void ReaderExecuted(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
 {
  Executed(command, interceptionContext);
  base.ReaderExecuted(command, interceptionContext);
 }

 public override void NonQueryExecuting(DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
 {
  Executing(interceptionContext);
  base.NonQueryExecuting(command, interceptionContext);
 }

 public override void NonQueryExecuted(DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
 {
  Executed(command, interceptionContext);
  base.NonQueryExecuted(command, interceptionContext);
 }

 public override void ScalarExecuting(DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
 {
  Executing(interceptionContext);
  base.ScalarExecuting(command, interceptionContext);
 }

 public override void ScalarExecuted(DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
 {
  Executed(command, interceptionContext);
  base.ScalarExecuted(command, interceptionContext);
 }
}

貌似发现了什么,好像方法参数都是什么DbCommand和DbCommandInterCeptionContext,既然这样,我们依样画葫芦诺,为了从执行SQL命令开始,我们此时从这里开始计时,将计时对象给UserState即可,于是就有了下面的代码。

 private void Executing<T>(DbCommandInterceptionContext<T> interceptionContext)
 {
  var timer = new Stopwatch();
  interceptionContext.UserState = timer;
  timer.Start();
 }

此时应该就明朗了,我们在执行完成后来获取该计时对象并利用是否出现异常和我们指定设置的时间来判断其最终所花费的时间。执行完成后代码如下:

 private void Executed<T>(DbCommand command, DbCommandInterceptionContext<T> interceptionContext)
 {
  var timer = (Stopwatch)interceptionContext.UserState;
  timer.Stop();

  if (interceptionContext.Exception != null)
  {
  File.AppendAllLines(
   _logFile,
   new string[]
  {
  "错误SQL语句",
  interceptionContext.Exception.Message,
  command.CommandText,
  Environment.StackTrace,
  string.Empty,
  string.Empty,
  });
  }
  else if (timer.ElapsedMilliseconds >= _executionTime)
  {
  File.AppendAllLines(
   _logFile,
   new string[]
  {
  string.Format("耗时SQL语句({0}ms)",timer.ElapsedMilliseconds),
  command.CommandText,
  Environment.StackTrace,
  string.Empty,
  string.Empty,
  });
  }
 }

上述 _executionTime 是我们在此类构造函数中所设置的时间,构造函数如下:

 private readonly string _logFile;
 private readonly int _executionTime;

 public SQLProfiler(string logFile, int executionTime)
 {
  _logFile = logFile;
  _executionTime = executionTime;
 }

而logFile则是我么所要输出的日志。此时别忘记最重要的一件事,那就是DbConfiguration配置类中进行注册(或者在配置文件中进行注册)。如下:

 public class MyDbConfiguration : DbConfiguration
 {
 public MyDbConfiguration()
 {
  this.AddInterceptor(new SQLProfiler(@"D:log.txt", 1));
 }
 }

接下来我们来进行检验结果。

检验成果

  using (var ctx = new EntityDbContext())
  {
  SqlParameter[] parameter = { };
  ctx.Database.SqlQuery<Student>("select * from a", parameter).ToList();
  Console.ReadKey();
  }

上述表a实际上是不存在的,我们就是要看看是否能检测到该异常并获取其时间。来,瞧一瞧。

【效果一】

技术分享

【效果二】

技术分享

结语

当然,如上述当执行查询时此表不存在肯定是会报错,但是我们的侧重点不在此,这里验证了此表不存在,同时也验证了SQL在执行时和执行完之间的耗时,同时我们可以通过构造函数手动设置当耗时大于我们预期的多少才算需要改善SQL。

 

EntityFramework之监听者判断SQL性能指标

标签:

热心网友 时间:2022-04-30 22:03

单从实现方式上来讲应该是entity framework效率更高,虽然我从没用过,也很少使用linq,entity framework是一套orm框架,类似的还有很多,而linq to sql 是在orm的基础上再去使用linq特性实现某个功能,相对基础语法,linq的使用只是减少了代码,却影响了性能。所以我认为linq to sql性能会差一些。但是,这也取决于两套东西内部具体的实现和应用,尤其应用在大数据量的场景中才能比较出差异。各有优劣,这样看来这个提问有点过于笼统了哦。 所以具体的应用还要看具体的需求,单独讲性能的话还是基础语法来的最快。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
抖音弹幕怎么关掉?怎么关闭抖音弹幕? 惠普LaserJet P3005D是否支持B5纸的双面打印? word打印出图片总是缺一部分怎么办-word打印图片不完整怎么解决_百度... 理想one哪里产的车辆? 抚州抚州ONE在哪里? one地址在哪里? 如何在图片上写字(如何在图片上添加文字) 网商贷为什么钱没到账 高级经济师职称怎么评 高级经济师需要评审吗 我在WORD2007的一个文档,在编辑中出现了问题,成了rescue.asd 格式... 不小心删除了asd文件,还能恢复word文档么 中国接线端子联盟行业门户网myduanzi接线端子的用法? 牧童骑牛野中走猜一生肖 蓝天红夕日己落牧童骑牛正归路是什么生肖 接线端子主要用在哪里? 接线端子是用在什么地方的?起来什么作用? 遇一牧童骑牛中家丑不可向外扔是什么生肖 快速接线端子使用方法? 做烧烤肉要先腌制吗,是怎么腌制的,是只放盐,鸡精,黄酒和淀粉吗, 伤风败俗金连到,知难而上好事来,命里有时终须有,遇壹牧童骑牛中,打一生肖 网线接线端子的使用方法? 遇一牧童骑牛中猜生肖 烧烤的肉串,经过腌制后,需要用水淀粉泡吗 网线连接端子是怎么用的 为什么是老鼠被猫吃啊? 遇一牧童骑牛中是哪个生肖 猫和老鼠里面的汤姆为什么喜欢喝牛奶 遇一牧童骑牛中是什么生肖? 猫为什么能把老鼠吃的干干净净? 寻找资料 有什么论坛社区可以下载最新电影的或者有最新种子的。免费注册的那种。而且最好是那种刚开始做的论坛社区 能能帮我下载这两文章http://www.doc88.com/p-707860578613.html... 大家有没有用过黑菜整合盘,求最新版本的下载链接。 芝麻信用分650以上可以免押金租车吗 奇瑞eq芝麻分多少才能免费租车? 怎么样能提高芝麻信用分600分以上,以便租车? 请问,我现在支付宝的芝麻分634,可以去租车吗,租车需要押金吗? 芝麻信用租车要钱吗 OA的APP真的算是移动办公吗 我的芝麻分655怎么还不能免押租车? 关于photoshop cs3的自带笔刷。 铁木砧板是用冷油泡还是用热油浇 常用OA办公软件有哪些?有没有免费好用的OA? OA协同办公你们用的是什么软件? OA办公软件和普通软件有何区别?有没有免费好用的平台? 夜空中最闪亮的星结局比赛谁赢了 夜空中最闪亮的星星在什么卫视播? 跪求《夜空中最闪亮的星2019》百度云无删减完整版在线观看,黄子韬主演的 推荐名侦探柯南tv版精彩的集。