Runner_EntityFramework.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. using App.OrmRunner.EntityFrameworkRunner;
  2. using Microsoft.EntityFrameworkCore;
  3. using Vit.Core.Util.ConfigurationManager;
  4. namespace App.OrmRunner
  5. {
  6. public partial class Runner_EntityFramework : IRunner
  7. {
  8. public void Run(RunConfig config)
  9. {
  10. for (int i = 0; i < config.repeatCount; i++)
  11. {
  12. using MyDbContext myDbContext = new MyDbContext();
  13. var userQuery = myDbContext.users;
  14. if (config.queryJoin)
  15. QueryExecute.QueryJoin(userQuery, config);
  16. else
  17. QueryExecute.Query(userQuery, config);
  18. }
  19. }
  20. }
  21. }
  22. namespace App.OrmRunner.EntityFrameworkRunner
  23. {
  24. // Entity Definition
  25. [System.ComponentModel.DataAnnotations.Schema.Table("User")]
  26. public class User
  27. {
  28. [System.ComponentModel.DataAnnotations.Key]
  29. public int id { get; set; }
  30. public string name { get; set; }
  31. public DateTime? birth { get; set; }
  32. public int? fatherId { get; set; }
  33. public int? motherId { get; set; }
  34. }
  35. public class MyDbContext : Microsoft.EntityFrameworkCore.DbContext
  36. {
  37. public Microsoft.EntityFrameworkCore.DbSet<User> users { get; set; }
  38. static string provider = Appsettings.json.GetStringByPath("Vitorm.Data[0].provider");
  39. static string connectionString = Appsettings.json.GetStringByPath("Vitorm.Data[0].connectionString");
  40. protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
  41. {
  42. switch (provider)
  43. {
  44. case "MySql": optionsBuilder.UseMySQL(connectionString); break;
  45. case "SqlServer": optionsBuilder.UseSqlServer(connectionString); break;
  46. case "Sqlite": optionsBuilder.UseSqlite(connectionString); break;
  47. }
  48. }
  49. }
  50. public class QueryExecute
  51. {
  52. public static void QueryJoin(IQueryable<User> userSet, RunConfig config)
  53. {
  54. var query =
  55. from user in userSet
  56. from father in userSet.Where(father => user.fatherId == father.id).DefaultIfEmpty()
  57. from mother in userSet.Where(mother => user.motherId == mother.id).DefaultIfEmpty()
  58. where user.id > 1 && user.id < 10000
  59. orderby user.id
  60. select new
  61. {
  62. user,
  63. father,
  64. mother,
  65. testId = user.id + 100,
  66. hasFather = father.name != null ? true : false
  67. }
  68. ;
  69. Execute(query, config);
  70. }
  71. public static void Query(IQueryable<User> userSet, RunConfig config)
  72. {
  73. var query =
  74. from user in userSet
  75. where user.id > 1 && user.id < 10000
  76. orderby user.id
  77. select user;
  78. Execute(query, config);
  79. }
  80. public static void Execute<Result>(IQueryable<Result> query, RunConfig config)
  81. {
  82. if (config.skip > 0) query = query.Skip(config.skip.Value);
  83. query = query.Take(config.take);
  84. if (config.executeQuery)
  85. {
  86. var userList = query.ToList();
  87. var rowCount = userList.Count;
  88. if (rowCount != config.take) throw new Exception($"query failed, expected row count : {config.take} , actual count: {rowCount} ");
  89. }
  90. else
  91. {
  92. var sql = query.ToQueryString();
  93. if (string.IsNullOrEmpty(sql)) throw new Exception($"query failed, can not generated sql script");
  94. }
  95. }
  96. }
  97. }