EfDataProvider_IQueryable.cs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. 
  2. using Microsoft.EntityFrameworkCore;
  3. using Microsoft.Extensions.DependencyInjection;
  4. using Newtonsoft.Json.Linq;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using System.Threading.Tasks;
  9. using Vit.Core.Util.ComponentModel.Data;
  10. using Vit.Core.Util.ComponentModel.Query;
  11. using Vit.Core.Util.ComponentModel.SsError;
  12. using Vit.Db.Module.Schema;
  13. using Vit.Extensions;
  14. using Vit.Extensions.ObjectExt;
  15. using Vit.Linq.Query;
  16. using Vit.Orm.EntityFramework.Extensions;
  17. namespace Vit.AutoTemp.DataProvider.Ef
  18. {
  19. public class EfDataProvider : IDataProvider
  20. {
  21. public string template { get; private set; }
  22. public bool isTree => pidField != null;
  23. public TableSchema tableSchema { get; private set; }
  24. string idField;
  25. string pidField;
  26. Type entityType;
  27. JObject controllerConfig;
  28. Func<(IServiceScope, DbContext)> CreateDbContext;
  29. public Func<DbContext, IQueryable> GetQueryable;
  30. public EfDataProvider(string template, Type entityType, Func<(IServiceScope, DbContext)> CreateDbContext) :
  31. this(template, AutoTempHelp.EfEntityToTableSchema(entityType), entityType, CreateDbContext)
  32. {
  33. }
  34. public EfDataProvider(string template, TableSchema tableSchema, Type entityType, Func<(IServiceScope, DbContext)> CreateDbContext)
  35. {
  36. this.template = template;
  37. this.tableSchema = tableSchema;
  38. this.entityType = entityType;
  39. this.CreateDbContext = CreateDbContext;
  40. GetQueryable = dbContext => dbContext.GetQueryableByTableName(tableSchema.table_name);
  41. Init();
  42. }
  43. /// <summary>
  44. ///
  45. /// </summary>
  46. public void Init()
  47. {
  48. controllerConfig = AutoTempHelp.BuildControllerConfigByTable(tableSchema);
  49. idField = controllerConfig["idField"]?.Value<string>();
  50. pidField = controllerConfig["pidField"]?.Value<string>();
  51. }
  52. #region getConfig
  53. public ApiReturn getControllerConfig(object sender)
  54. {
  55. return new ApiReturn<JObject>(controllerConfig);
  56. }
  57. #endregion
  58. #region getList
  59. public ApiReturn getList(object sender, List<DataFilter> filter, IEnumerable<SortItem> sort, PageInfo page, JObject arg)
  60. {
  61. var (scope, dbContext) = CreateDbContext();
  62. using (scope)
  63. {
  64. var queryable = GetQueryable(dbContext);
  65. var pageData = queryable.Ef_ToPageDataAsync(filter, sort, page, (object ori) => { return ori.ConvertBySerialize<JObject>(); }).Result;
  66. #region _childrenCount
  67. if (isTree)
  68. {
  69. var task_count = pageData.rows.Select(async m =>
  70. {
  71. var filters = new[] { new DataFilter { field = pidField, opt = "=", value = m[idField].GetValue() } };
  72. var count = await queryable.IQueryable_Where(filters).Ef_CountAsync();
  73. m["_childrenCount"] = count;
  74. });
  75. Task.WaitAll(task_count.ToArray());
  76. }
  77. #endregion
  78. return new ApiReturn<object> { data = pageData };
  79. }
  80. }
  81. #endregion
  82. #region getModel
  83. public ApiReturn getModel(object sender, string id)
  84. {
  85. var (scope, dbContext) = CreateDbContext();
  86. using (scope)
  87. {
  88. var queryable = GetQueryable(dbContext);
  89. queryable = queryable.IQueryable_Where(new DataFilter { field = idField, opt = "=", value = id });
  90. return new ApiReturn<object> { data = queryable.Ef_FirstOrDefault() };
  91. }
  92. }
  93. #endregion
  94. #region insert
  95. public ApiReturn insert(object sender, JObject model)
  96. {
  97. var userModel = model.ConvertBySerialize(entityType);
  98. var (scope, dbContext) = CreateDbContext();
  99. using (scope)
  100. {
  101. dbContext.Add(userModel);
  102. dbContext.SaveChanges();
  103. }
  104. return new ApiReturn<object>(userModel);
  105. }
  106. #endregion
  107. #region update
  108. public ApiReturn update(object sender, JObject model)
  109. {
  110. var userModel = model.ConvertBySerialize(entityType);
  111. var (scope, dbContext) = CreateDbContext();
  112. using (scope)
  113. {
  114. var queryable = GetQueryable(dbContext);
  115. var entity = queryable
  116. .IQueryable_Where(new DataFilter { field = idField, opt = "=", value = model[idField] })
  117. .Ef_FirstOrDefault();
  118. if (entity == null)
  119. {
  120. return new SsError
  121. {
  122. errorMessage = "待修改的数据不存在"
  123. };
  124. }
  125. entity.CopyNotNullProrertyFrom(userModel);
  126. dbContext.Update(entity);
  127. dbContext.SaveChanges();
  128. return new ApiReturn<object> { data = entity };
  129. }
  130. }
  131. #endregion
  132. #region delete
  133. public ApiReturn delete(object sender, JObject arg)
  134. {
  135. var (scope, dbContext) = CreateDbContext();
  136. using (scope)
  137. {
  138. var queryable = GetQueryable(dbContext);
  139. var entity = queryable
  140. .IQueryable_Where(new DataFilter { field = idField, opt = "=", value = arg["id"].GetValue() })
  141. .Ef_FirstOrDefault();
  142. if (entity == null)
  143. {
  144. return new SsError
  145. {
  146. errorMessage = "数据不存在"
  147. };
  148. }
  149. dbContext.Remove(entity);
  150. dbContext.SaveChanges();
  151. return new ApiReturn();
  152. }
  153. }
  154. #endregion
  155. }
  156. }