1. /// <summary>
    2. /// 实体基类
    3. /// </summary>
    4. public class EntityBase
    5. {
    6. /// <summary>
    7. /// ID
    8. /// </summary>
    9. [Key]
    10. [Required]
    11. [MaxLength(20)]
    12. [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    13. public string id { get; set; } = SnowFlake.GenId().ToString();
    14. /// <summary>
    15. /// 创建时间
    16. /// </summary>
    17. [Required]
    18. [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    19. public DateTime createTime { get; set; } = DateTime.Now;
    20. /// <summary>
    21. /// 创建人ID
    22. /// </summary>
    23. public string createUserId { get; set; }
    24. /// <summary>
    25. /// 创建人名称
    26. /// </summary>
    27. public string createUserName { get; set; }
    28. /// <summary>
    29. /// 修改时间
    30. /// </summary>
    31. [Required]
    32. [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    33. public DateTime modifiedTime { get; set; } = DateTime.Now;
    34. /// <summary>
    35. /// 修改人
    36. /// </summary>
    37. public string modefiedUserId { get; set; }
    38. /// <summary>
    39. /// 修改人名称
    40. /// </summary>
    41. public string modifiedUserName { get; set; }
    42. /// <summary>
    43. /// 是否已删除
    44. /// </summary>
    45. [Required]
    46. [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    47. public bool isDeleted { get; set; } = false;
    48. }
    1. public class BllBase : IDisposable
    2. {
    3. /// <summary>
    4. ///
    5. /// </summary>
    6. public bool IsTopBll = true;
    7. /// <summary>
    8. ///
    9. /// </summary>
    10. public SqliteContext SqlLiteDbContext { get; set; }
    11. /// <summary>
    12. ///
    13. /// </summary>
    14. public MySqlContext MySqlDbContext { get; set; }
    15. /// <summary>
    16. ///
    17. /// </summary>
    18. public InfluxDBClient InfluxClient { get; set; }
    19. /// <summary>
    20. ///
    21. /// </summary>
    22. public List<IDisposable> DalList { get; set; } = new List<IDisposable>();
    23. /// <summary>
    24. ///
    25. /// </summary>
    26. /// <typeparam name="T"></typeparam>
    27. /// <returns></returns>
    28. public T CreateDal<T>() where T : DalBase, new()
    29. {
    30. var dal = new T();
    31. if (dal is SqlLiteDalBase sqlLiteDalBase)
    32. {
    33. SqlLiteDbContext ??= new SqliteContext();
    34. sqlLiteDalBase.DbContext = SqlLiteDbContext;
    35. }
    36. else if (dal is MySqlDalBase sqlDalBase)
    37. {
    38. MySqlDbContext ??= new MySqlContext();
    39. sqlDalBase.DbContext = MySqlDbContext;
    40. }
    41. else if (dal is InfluxDbDalBase influxDbDalBase)
    42. {
    43. InfluxClient ??= new InfluxDBClient(SystemConfigReader.influxlDb, SystemConfigReader.influxlDbUsername,
    44. SystemConfigReader.influxlDbPWD);
    45. influxDbDalBase.InfluxClient = InfluxClient;
    46. }
    47. DalList.Add(dal);
    48. return dal;
    49. }
    50. /// <summary>
    51. ///
    52. /// </summary>
    53. /// <typeparam name="T"></typeparam>
    54. /// <returns></returns>
    55. public DalWithTransaction<T> CreateDalWithTransaction<T>() where T : MySqlDalBase, new()
    56. {
    57. DalWithTransaction<T> res = new DalWithTransaction<T>();
    58. var dal = CreateDal<T>();
    59. res.Dal = dal;
    60. res.Transaction = MySqlDbContext.Database.BeginTransaction();
    61. return res;
    62. }
    63. /// <summary>
    64. ///
    65. /// </summary>
    66. /// <returns></returns>
    67. public IDbContextTransaction BeginMysqlTransaction()
    68. {
    69. return MySqlDbContext.Database.BeginTransaction();
    70. }
    71. //*************************************************************
    72. /// <summary>
    73. ///
    74. /// </summary>
    75. /// <param name="entity"></param>
    76. /// <typeparam name="TO"></typeparam>
    77. /// <typeparam name="TFrom"></typeparam>
    78. /// <returns></returns>
    79. protected TO ConvertData<TO, TFrom>(TFrom entity) where TFrom : class where TO : class, new()
    80. {
    81. var outData = new TO();
    82. var outDataProperties = typeof(TO).GetProperties();
    83. foreach (System.Reflection.PropertyInfo property in entity.GetType().GetProperties())
    84. {
    85. var val = property.GetValue(entity);
    86. var findOutDataP = outDataProperties.FirstOrDefault(o => o.Name == property.Name && o.PropertyType == property.PropertyType);
    87. findOutDataP?.SetValue(outData, val);
    88. }
    89. return outData;
    90. }
    91. /// <summary>
    92. ///
    93. /// </summary>
    94. /// <typeparam name="T"></typeparam>
    95. /// <returns></returns>
    96. protected T CreateBll<T>() where T : BllBase, new()
    97. {
    98. var bll = new T();
    99. bll.IsTopBll = false;
    100. bll.SqlLiteDbContext = SqlLiteDbContext;
    101. bll.MySqlDbContext = MySqlDbContext;
    102. bll.InfluxClient = InfluxClient;
    103. return bll;
    104. }
    105. /// <summary>
    106. ///
    107. /// </summary>
    108. public virtual void Dispose()
    109. {
    110. foreach (var item in DalList)
    111. {
    112. item.Dispose();
    113. }
    114. DalList.Clear();
    115. if (SqlLiteDbContext != null)
    116. {
    117. if (IsTopBll)
    118. {
    119. SqlLiteDbContext.Dispose();
    120. }
    121. SqlLiteDbContext = null;
    122. }
    123. if (MySqlDbContext != null)
    124. {
    125. if (IsTopBll)
    126. {
    127. MySqlDbContext.Dispose();
    128. }
    129. MySqlDbContext = null;
    130. }
    131. if (InfluxClient != null)
    132. {
    133. if (IsTopBll)
    134. {
    135. InfluxClient.Dispose();
    136. }
    137. InfluxClient = null;
    138. }
    139. }
    140. }
    1. public class BllBase<TDbDal> : BllBase where TDbDal : DbDalBase, new()
    2. {
    3. /// <summary>
    4. ///
    5. /// </summary>
    6. public DbContext DbContext => Dal.DbContext;
    7. /// <summary>
    8. ///
    9. /// </summary>
    10. public void SaveChanges()
    11. {
    12. DbContext.SaveChanges();
    13. }
    14. private TDbDal _dal;
    15. /// <summary>
    16. ///
    17. /// </summary>
    18. public TDbDal Dal => _dal ??= CreateDal<TDbDal>();
    19. }
    1. /// <summary>
    2. /// 查询条件
    3. /// </summary>
    4. public class QueryFilter
    5. {
    6. /// <summary>
    7. /// Where
    8. /// </summary>
    9. [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    10. public List<FilterWhereItem> WhereItems { get; set; }
    11. /// <summary>
    12. /// 排序规则
    13. /// </summary>
    14. [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    15. public List<FilterSortOrder> SortOrders { get; set; }
    16. }
    17. /// <summary>
    18. /// 排序规则
    19. /// </summary>
    20. public class FilterSortOrder
    21. {
    22. /// <summary>
    23. /// 字段名称
    24. /// </summary>
    25. [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    26. public string PropertyName { get; set; }
    27. /// <summary>
    28. /// 排序方向
    29. /// </summary>
    30. [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    31. public SortOrder Order { get; set; }
    32. }
    33. /// <summary>
    34. /// where条件
    35. /// </summary>
    36. public class FilterWhereItem
    37. {
    38. /// <summary>
    39. /// 字段名称
    40. /// </summary>
    41. [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    42. public string PropertyName { get; set; }
    43. /// <summary>
    44. /// 值(必须是基础类型)
    45. /// </summary>
    46. [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    47. public List<object> Values { get; set; }
    48. /// <summary>
    49. /// 逻辑运算
    50. /// </summary>
    51. [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    52. public Logical Logical { get; set; }
    53. }
    54. /// <summary>
    55. /// 逻辑运算
    56. /// </summary>
    57. public enum Logical
    58. {
    59. /// <summary>
    60. /// 模糊查询
    61. /// </summary>
    62. [Description("模糊查询")]
    63. Like = 0,
    64. /// <summary>
    65. /// 等于
    66. /// </summary>
    67. [Description("等于")]
    68. Eq = 1,
    69. /// <summary>
    70. /// 大于
    71. /// </summary>
    72. [Description("大于")]
    73. Gt = 2,
    74. /// <summary>
    75. /// 小于
    76. /// </summary>
    77. [Description("小于")]
    78. Lt = 3,
    79. /// <summary>
    80. /// 大于等于
    81. /// </summary>
    82. [Description("大于等于")]
    83. Gte = 4,
    84. /// <summary>
    85. /// 小于等于
    86. /// </summary>
    87. [Description("小于等于")]
    88. Lte = 5,
    89. /// <summary>
    90. /// IN查询
    91. /// </summary>
    92. [Description("IN查询")]
    93. In = 6
    94. }
    1. public class ApiControllerBase<T, TBll, TDal> : ApiControllerBase
    2. where TBll : BllBase<TDal>, new()
    3. where T : EntityBase, new()
    4. where TDal : MySqlDalBase<T>, new()
    5. {
    6. /// <summary>
    7. ///
    8. /// </summary>
    9. public ApiControllerBase()
    10. {
    11. Bll = new TBll();
    12. }
    13. /// <summary>
    14. ///
    15. /// </summary>
    16. public TBll Bll { get; set; }
    17. /// <summary>
    18. /// 详情
    19. /// </summary>
    20. /// <param name="id">id</param>
    21. /// <returns>详情</returns>
    22. [Route("detail")]
    23. [HttpGet]
    24. [ApiInfo(needAuth: false)]
    25. public virtual T QueryDetail(string id)
    26. {
    27. return Bll.Dal.FindById<T>(id);
    28. }
    29. /// <summary>
    30. /// 分页查询
    31. /// </summary>
    32. /// <param name="pageIndex">页码(从1开始)</param>
    33. /// <param name="pageSize">页大小</param>
    34. /// <param name="filter">查询条件</param>
    35. /// <returns>分页数据</returns>
    36. [Route("queryPage")]
    37. [HttpPost]
    38. [ApiInfo(needAuth: false)]
    39. public virtual SearchPage<T> QueryPage(int pageIndex, int pageSize, [FromBody] QueryFilter filter)
    40. {
    41. return Bll.Dal.QueryPage<T>(pageIndex, pageSize, filter);
    42. }
    43. /// <summary>
    44. /// 条件查询
    45. /// </summary>
    46. /// <param name="filter">查询条件</param>
    47. /// <returns>数据</returns>
    48. [Route("query")]
    49. [HttpPost]
    50. [ApiInfo(needAuth: false)]
    51. public virtual IEnumerable<T> QueryByFilter([FromBody] QueryFilter filter)
    52. {
    53. return Bll.Dal.Query<T>(filter);
    54. }
    55. /// <summary>
    56. /// 查询所有
    57. /// </summary>
    58. /// <returns>数据</returns>
    59. [Route("all")]
    60. [HttpGet]
    61. [ApiInfo(needAuth: false)]
    62. public virtual IEnumerable<T> QueryAll()
    63. {
    64. return Bll.Dal.FindAll<T>();
    65. }
    66. /// <summary>
    67. /// 更新
    68. /// </summary>
    69. /// <param name="data">数据</param>
    70. /// <returns>数据</returns>
    71. [Route("addOrUpdate")]
    72. [HttpPost]
    73. [ApiInfo(needAuth: false)]
    74. public virtual T AddOrUpdate([FromBody] T data)
    75. {
    76. var addOrUpdate = Bll.Dal.AddOrUpdate(data);
    77. Bll.SaveChanges();
    78. return addOrUpdate;
    79. }
    80. /// <summary>
    81. /// 批量更新
    82. /// </summary>
    83. /// <param name="data">数据</param>
    84. /// <returns>数据</returns>
    85. [Route("addOrUpdateAll")]
    86. [HttpPost]
    87. [ApiInfo(needAuth: false)]
    88. public virtual IEnumerable<T> AddOrUpdateAll([FromBody] List<T> data)
    89. {
    90. var addOrUpdateAll = Bll.Dal.AddOrUpdateAll(data);
    91. Bll.SaveChanges();
    92. return addOrUpdateAll;
    93. }
    94. /// <summary>
    95. /// 删除
    96. /// </summary>
    97. /// <param name="ids">ID集合</param>
    98. /// <returns>是否成功</returns>
    99. [Route("remove")]
    100. [HttpPost]
    101. [ApiInfo(needAuth: false)]
    102. public virtual bool Remove([FromBody] List<string> ids)
    103. {
    104. var delete = Bll.Dal.Delete<T>(ids);
    105. Bll.SaveChanges();
    106. return delete;
    107. }
    108. }
    1. /// <summary>
    2. ///
    3. /// </summary>
    4. public class DalBase : IDisposable
    5. {
    6. /// <summary>
    7. ///
    8. /// </summary>
    9. public virtual void Dispose()
    10. {
    11. }
    12. }
    13. /// <summary>
    14. ///
    15. /// </summary>
    16. public class DbDalBase : DalBase
    17. {
    18. /// <summary>
    19. ///
    20. /// </summary>
    21. public DbContext DbContext { get; set; }
    22. /// <summary>
    23. ///
    24. /// </summary>
    25. public override void Dispose()
    26. {
    27. base.Dispose();
    28. DbContext?.Dispose();
    29. }
    30. /// <summary>
    31. ///
    32. /// </summary>
    33. /// <param name="data"></param>
    34. /// <typeparam name="T"></typeparam>
    35. /// <returns></returns>
    36. public T Of<T>(T data) where T : EntityBase
    37. {
    38. data.id = string.IsNullOrWhiteSpace(data.id) ? SnowFlake.GenId().ToString() : data.id;
    39. data.createTime = data.createTime == new DateTime() ? DateTime.Now : data.createTime;
    40. data.createUserId = string.IsNullOrWhiteSpace(data.createUserId) ? LoginUserHelper.GetLoginUser()?.Id : data.createUserId;
    41. data.createUserName = string.IsNullOrWhiteSpace(data.createUserName) ? LoginUserHelper.GetLoginUser()?.UserName : data.createUserName;
    42. data.modifiedTime = data.modifiedTime == new DateTime() ? DateTime.Now : data.modifiedTime;
    43. data.modefiedUserId = string.IsNullOrWhiteSpace(data.modefiedUserId) ? LoginUserHelper.GetLoginUser()?.Id : data.modefiedUserId;
    44. data.modifiedUserName = string.IsNullOrWhiteSpace(data.modifiedUserName) ? LoginUserHelper.GetLoginUser()?.UserName : data.modifiedUserName;
    45. data.isDeleted = false;
    46. return data;
    47. }
    48. /// <summary>
    49. ///
    50. /// </summary>
    51. /// <param name="id"></param>
    52. /// <typeparam name="T"></typeparam>
    53. /// <returns></returns>
    54. public T FindById<T>(string id) where T : EntityBase
    55. {
    56. return DbContext.Set<T>().AsNoTracking().FirstOrDefault(p => p.id == id);
    57. }
    58. /// <summary>
    59. ///
    60. /// </summary>
    61. /// <param name="ids"></param>
    62. /// <typeparam name="T"></typeparam>
    63. /// <returns></returns>
    64. public List<T> FindByIds<T>(IEnumerable<string> ids) where T : EntityBase
    65. {
    66. return DbContext.Set<T>().AsNoTracking().Where(p => ids.Contains(p.id)).ToList();
    67. }
    68. /// <summary>
    69. ///
    70. /// </summary>
    71. /// <param name="data"></param>
    72. /// <typeparam name="T"></typeparam>
    73. /// <returns></returns>
    74. public T AddOrUpdate<T>(T data) where T : EntityBase
    75. {
    76. return AddOrUpdate(data, out _);
    77. }
    78. /// <summary>
    79. ///
    80. /// </summary>
    81. /// <param name="data"></param>
    82. /// <param name="isNewData"></param>
    83. /// <typeparam name="T"></typeparam>
    84. /// <returns></returns>
    85. public T AddOrUpdate<T>(T data, out bool isNewData) where T : EntityBase
    86. {
    87. isNewData = string.IsNullOrWhiteSpace(data.id) || !DbContext.Set<T>().Any(p => p.id == data.id);
    88. return isNewData ? DbContext.Set<T>().Add(Of(data)).Entity : DbContext.Set<T>().Update(Of(data)).Entity;
    89. }
    90. /// <summary>
    91. ///
    92. /// </summary>
    93. /// <typeparam name="T"></typeparam>
    94. /// <param name="dataEnumerable"></param>
    95. /// <returns></returns>
    96. public List<T> AddOrUpdateAll<T>(IEnumerable<T> dataEnumerable) where T : EntityBase
    97. {
    98. return AddOrUpdateAll(dataEnumerable, out _, out _);
    99. }
    100. /// <summary>
    101. ///
    102. /// </summary>
    103. /// <param name="dataEnumerable"></param>
    104. /// <param name="addEquatable"></param>
    105. /// <param name="updateEquatable"></param>
    106. /// <typeparam name="T"></typeparam>
    107. /// <returns></returns>
    108. public List<T> AddOrUpdateAll<T>(IEnumerable<T> dataEnumerable, out List<T> addEquatable, out List<T> updateEquatable) where T : EntityBase
    109. {
    110. addEquatable = new List<T>();
    111. updateEquatable = new List<T>();
    112. var addOrUpdateAll = dataEnumerable as T[] ?? dataEnumerable.ToArray();
    113. if (!addOrUpdateAll.Any())
    114. {
    115. return addOrUpdateAll.ToList();
    116. }
    117. List<T> result = new List<T>();
    118. List<string> ids = addOrUpdateAll.Select(p => p.id).Where(p => !string.IsNullOrWhiteSpace(p)).Distinct().ToList();
    119. var inHave = ids.Count < 1 ? new List<string>() : DbContext.Set<T>().Where(p => ids.Contains(p.id)).Select(p => p.id).ToList();
    120. var needUpdate = addOrUpdateAll.Where(p => inHave.Contains(p.id)).ToList();
    121. var needAdd = addOrUpdateAll.Where(p => !inHave.Contains(p.id)).ToList();
    122. foreach (var data in needAdd)
    123. {
    124. DbContext.Set<T>().Add(Of(data));
    125. result.Add(data);
    126. addEquatable.Add(data);
    127. }
    128. foreach (var data in needUpdate)
    129. {
    130. DbContext.Set<T>().Update(Of(data));
    131. result.Add(data);
    132. updateEquatable.Add(data);
    133. }
    134. return result;
    135. }
    136. /// <summary>
    137. ///
    138. /// </summary>
    139. /// <param name="data"></param>
    140. /// <typeparam name="T"></typeparam>
    141. /// <returns></returns>
    142. public bool Delete<T>(T data) where T : EntityBase, new()
    143. {
    144. var childTableAttributes = typeof(T).GetCustomAttributes<ChildTableAttribute>();
    145. foreach (var childTableAttribute in childTableAttributes)
    146. {
    147. DeleteChild(childTableAttribute, new List<string> { data.id });
    148. }
    149. return DbContext.Set<T>().Where(p => p.id == data.id).Update(p => new T { isDeleted = true }) > 0;
    150. }
    151. /// <summary>
    152. ///
    153. /// </summary>
    154. /// <param name="ids"></param>
    155. /// <typeparam name="T"></typeparam>
    156. /// <returns></returns>
    157. public bool Delete<T>(List<string> ids) where T : EntityBase, new()
    158. {
    159. var childTableAttributes = typeof(T).GetCustomAttributes<ChildTableAttribute>();
    160. foreach (var childTableAttribute in childTableAttributes)
    161. {
    162. DeleteChild(childTableAttribute, ids);
    163. }
    164. return DbContext.Set<T>().Where(p => ids.Contains(p.id)).Update(p => new T { isDeleted = true }) > 0;
    165. }
    166. /// <summary>
    167. ///
    168. /// </summary>
    169. /// <typeparam name="T"></typeparam>
    170. /// <returns></returns>
    171. public List<T> FindAll<T>() where T : EntityBase
    172. {
    173. return DbContext.Set<T>().ToList();
    174. }
    175. /// <summary>
    176. ///
    177. /// </summary>
    178. /// <param name="filter"></param>
    179. /// <typeparam name="T"></typeparam>
    180. /// <returns></returns>
    181. public List<T> Query<T>(QueryFilter filter) where T : EntityBase
    182. {
    183. filter = EditFileName<T>(filter);
    184. IQueryable<T> queryable = DbContext.Set<T>().AsNoTracking();
    185. foreach (var filterWhereItem in filter.WhereItems)
    186. {
    187. queryable = AddWhere(queryable, filterWhereItem);
    188. }
    189. queryable = AddSort(queryable, filter.SortOrders);
    190. return queryable.ToList();
    191. }
    192. /// <summary>
    193. /// 分页查询
    194. /// </summary>
    195. /// <param name="pageIndex">页码(1开始)</param>
    196. /// <param name="pageSize"></param>
    197. /// <param name="filter"></param>
    198. /// <returns></returns>
    199. public SearchPage<T> QueryPage<T>(int pageIndex, int pageSize, QueryFilter filter) where T : EntityBase
    200. {
    201. filter = EditFileName<T>(filter);
    202. IQueryable<T> queryable = DbContext.Set<T>().AsNoTracking();
    203. foreach (var filterWhereItem in filter?.WhereItems ?? new List<FilterWhereItem>())
    204. {
    205. queryable = AddWhere(queryable, filterWhereItem);
    206. }
    207. int count = queryable.Count();
    208. queryable = AddSort(queryable, filter?.SortOrders ?? new List<FilterSortOrder>());
    209. return new SearchPage<T>
    210. {
    211. totalDataCount = count,
    212. pageIndex = pageIndex,
    213. pageSize = pageSize,
    214. data = queryable.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList()
    215. };
    216. }
    217. /// <summary>
    218. /// 查询数量
    219. /// </summary>
    220. /// <param name="filter"></param>
    221. /// <typeparam name="T"></typeparam>
    222. /// <returns></returns>
    223. public int QueryCount<T>(QueryFilter filter) where T : EntityBase
    224. {
    225. filter = EditFileName<T>(filter);
    226. IQueryable<T> queryable = DbContext.Set<T>().AsNoTracking();
    227. foreach (var filterWhereItem in filter?.WhereItems ?? new List<FilterWhereItem>())
    228. {
    229. queryable = AddWhere(queryable, filterWhereItem);
    230. }
    231. int count = queryable.Count();
    232. return count;
    233. }
    234. private IQueryable<T> AddSort<T>(IQueryable<T> queryable, List<FilterSortOrder> filterSortOrders) where T : EntityBase
    235. {
    236. if (filterSortOrders == null || filterSortOrders.Count < 1)
    237. {
    238. return queryable;
    239. }
    240. var sortOrders = filterSortOrders.Where(p => p.Order != SortOrder.Unspecified).ToList();
    241. if (sortOrders.Count < 1)
    242. {
    243. return queryable;
    244. }
    245. StringBuilder stringBuilder = new StringBuilder();
    246. foreach (var filterSortOrder in sortOrders)
    247. {
    248. stringBuilder.Append($"{filterSortOrder.PropertyName}{(filterSortOrder.Order == SortOrder.Ascending ? ", " : " desc, ")}");
    249. }
    250. return queryable.OrderBy(stringBuilder.ToString().Trim().Trim(','));
    251. }
    252. private IQueryable<T> AddWhere<T>(IQueryable<T> queryable, FilterWhereItem filterWhereItem) where T : EntityBase
    253. {
    254. switch (filterWhereItem.Logical)
    255. {
    256. case Logical.Like:
    257. {
    258. if (filterWhereItem.Values != null
    259. && filterWhereItem.Values.Count > 0
    260. && !string.IsNullOrWhiteSpace(filterWhereItem.Values[0]?.ToString()))
    261. {
    262. return queryable.Where($"{filterWhereItem.PropertyName}.Contains(@0)", filterWhereItem.Values[0].ToString());
    263. }
    264. }
    265. break;
    266. case Logical.Eq:
    267. if (filterWhereItem.Values != null
    268. && filterWhereItem.Values.Count > 0
    269. && filterWhereItem.Values[0] != null)
    270. {
    271. return queryable.Where($"{filterWhereItem.PropertyName} == @0", ConvertArg<T>(filterWhereItem.PropertyName, filterWhereItem.Values));
    272. }
    273. break;
    274. case Logical.Gt:
    275. if (filterWhereItem.Values != null
    276. && filterWhereItem.Values.Count > 0
    277. && filterWhereItem.Values[0] != null)
    278. {
    279. return queryable.Where($"{filterWhereItem.PropertyName} > @0", ConvertArg<T>(filterWhereItem.PropertyName, filterWhereItem.Values));
    280. }
    281. break;
    282. case Logical.Lt:
    283. if (filterWhereItem.Values != null
    284. && filterWhereItem.Values.Count > 0
    285. && filterWhereItem.Values[0] != null)
    286. {
    287. return queryable.Where($"{filterWhereItem.PropertyName} < @0", ConvertArg<T>(filterWhereItem.PropertyName, filterWhereItem.Values));
    288. }
    289. break;
    290. case Logical.Gte:
    291. if (filterWhereItem.Values != null
    292. && filterWhereItem.Values.Count > 0
    293. && filterWhereItem.Values[0] != null)
    294. {
    295. return queryable.Where($"{filterWhereItem.PropertyName} >= @0", ConvertArg<T>(filterWhereItem.PropertyName, filterWhereItem.Values));
    296. }
    297. break;
    298. case Logical.Lte:
    299. if (filterWhereItem.Values != null
    300. && filterWhereItem.Values.Count > 0
    301. && filterWhereItem.Values[0] != null)
    302. {
    303. return queryable.Where($"{filterWhereItem.PropertyName} <= @0", ConvertArg<T>(filterWhereItem.PropertyName, filterWhereItem.Values));
    304. }
    305. break;
    306. case Logical.In:
    307. if (filterWhereItem.Values != null && filterWhereItem.Values.Count > 0)
    308. {
    309. return queryable.Where($"@0.Contains({filterWhereItem.PropertyName})", ConvertArg<T>(filterWhereItem.PropertyName, filterWhereItem.Values, true));
    310. }
    311. break;
    312. default:
    313. return queryable;
    314. }
    315. return queryable;
    316. }
    317. private object ConvertArg<T>(string propertyName, List<object> value, bool b = false) where T : EntityBase
    318. {
    319. var propertyInfo = typeof(T).GetProperty(propertyName);
    320. if (propertyInfo == null)
    321. {
    322. throw new Exception("不存在的属性:" + propertyName);
    323. }
    324. if (b)
    325. {
    326. return value?.Select(p => ConvertData(propertyInfo.PropertyType, p)).ToList();
    327. }
    328. return value == null || value.Count < 1 ? null : ConvertData(propertyInfo.PropertyType, value[0]);
    329. }
    330. private object ConvertData(Type type, object o)
    331. {
    332. if (o == null)
    333. {
    334. return null;
    335. }
    336. if (type == typeof(string))
    337. {
    338. return o.ToString();
    339. }
    340. if (type == typeof(DateTime))
    341. {
    342. return DateTime.Parse(o.ToString() ?? "0000-00-00 00:00:00");
    343. }
    344. if (type.IsSubclassOf(typeof(Enum)))
    345. {
    346. return Enum.Parse(type, o.ToString() ?? string.Empty);
    347. }
    348. var typeConverter = TypeDescriptor.GetConverter(type);
    349. return typeConverter.ConvertFrom(o);
    350. }
    351. private QueryFilter EditFileName<T>(QueryFilter filter) where T : EntityBase
    352. {
    353. if (filter == null)
    354. {
    355. return null;
    356. }
    357. foreach (var filterSortOrder in filter.SortOrders ?? new List<FilterSortOrder>())
    358. {
    359. filterSortOrder.PropertyName = GetActualPropertyName<T>(filterSortOrder.PropertyName);
    360. }
    361. foreach (var filterWhereItem in filter.WhereItems ?? new List<FilterWhereItem>())
    362. {
    363. filterWhereItem.PropertyName = GetActualPropertyName<T>(filterWhereItem.PropertyName);
    364. }
    365. return filter;
    366. }
    367. private string GetActualPropertyName<T>(string propertyName) where T : EntityBase
    368. {
    369. foreach (var propertyInfo in typeof(T).GetProperties())
    370. {
    371. if (propertyInfo.Name.ToLower() == propertyName.ToLower())
    372. {
    373. return propertyInfo.Name;
    374. }
    375. }
    376. throw new Exception("无效的属性名称:" + propertyName);
    377. }
    378. private void DeleteChild(ChildTableAttribute childTableAttribute, List<string> ids)
    379. {
    380. List<object> objects = DbContext.SetDynamic(childTableAttribute.ChildType.Name)
    381. .Where($"@0.Contains({childTableAttribute.PropertyName})", ids)
    382. .ToList();
    383. foreach (var entityBase in objects)
    384. {
    385. var entityEntry = DbContext.Entry(entityBase);
    386. Of((EntityBase)entityEntry.Entity);
    387. ((EntityBase)entityEntry.Entity).isDeleted = true;
    388. DbContext.Update(entityEntry.Entity);
    389. }
    390. }
    391. }