QueryWithNoLockDbCommandInterceptor.cs 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. using Microsoft.EntityFrameworkCore.Diagnostics;
  2. using System.Data.Common;
  3. using System.Text.RegularExpressions;
  4. namespace Masuit.Tools.Core;
  5. public class QueryWithNoLockDbCommandInterceptor : DbCommandInterceptor
  6. {
  7. private static readonly Regex TableAliasRegex = new Regex(@"(?<tableAlias>AS \[[a-zA-Z]\w*\](?! WITH \(NOLOCK\)))", RegexOptions.Multiline | RegexOptions.Compiled | RegexOptions.IgnoreCase);
  8. public override InterceptionResult<object> ScalarExecuting(DbCommand command, CommandEventData eventData, InterceptionResult<object> result)
  9. {
  10. command.CommandText = TableAliasRegex.Replace(
  11. command.CommandText,
  12. "${tableAlias} WITH (NOLOCK)"
  13. );
  14. return base.ScalarExecuting(command, eventData, result);
  15. }
  16. #if NETCOREAPP3_1
  17. public override Task<InterceptionResult<object>> ScalarExecutingAsync(DbCommand command, CommandEventData eventData, InterceptionResult<object> result,
  18. CancellationToken cancellationToken = new CancellationToken())
  19. {
  20. command.CommandText = TableAliasRegex.Replace(
  21. command.CommandText,
  22. "${tableAlias} WITH (NOLOCK)"
  23. );
  24. return base.ScalarExecutingAsync(command, eventData, result, cancellationToken);
  25. }
  26. #else
  27. public override ValueTask<InterceptionResult<object>> ScalarExecutingAsync(DbCommand command, CommandEventData eventData, InterceptionResult<object> result,
  28. CancellationToken cancellationToken = new CancellationToken())
  29. {
  30. command.CommandText = TableAliasRegex.Replace(
  31. command.CommandText,
  32. "${tableAlias} WITH (NOLOCK)"
  33. );
  34. return base.ScalarExecutingAsync(command, eventData, result, cancellationToken);
  35. }
  36. #endif
  37. public override InterceptionResult<DbDataReader> ReaderExecuting(DbCommand command, CommandEventData eventData, InterceptionResult<DbDataReader> result)
  38. {
  39. command.CommandText = TableAliasRegex.Replace(
  40. command.CommandText,
  41. "${tableAlias} WITH (NOLOCK)"
  42. );
  43. return result;
  44. }
  45. #if NETCOREAPP3_1
  46. public override Task<InterceptionResult<DbDataReader>> ReaderExecutingAsync(DbCommand command, CommandEventData eventData, InterceptionResult<DbDataReader> result,
  47. CancellationToken cancellationToken = new CancellationToken())
  48. {
  49. command.CommandText = TableAliasRegex.Replace(
  50. command.CommandText,
  51. "${tableAlias} WITH (NOLOCK)"
  52. );
  53. return base.ReaderExecutingAsync(command, eventData, result, cancellationToken);
  54. }
  55. #else
  56. public override ValueTask<InterceptionResult<DbDataReader>> ReaderExecutingAsync(DbCommand command, CommandEventData eventData, InterceptionResult<DbDataReader> result,
  57. CancellationToken cancellationToken = new CancellationToken())
  58. {
  59. command.CommandText = TableAliasRegex.Replace(
  60. command.CommandText,
  61. "${tableAlias} WITH (NOLOCK)"
  62. );
  63. return base.ReaderExecutingAsync(command, eventData, result, cancellationToken);
  64. }
  65. #endif
  66. }