BaseRepository.cs 46 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052
  1. using AutoMapper;
  2. using AutoMapper.QueryableExtensions;
  3. using EFCoreSecondLevelCacheInterceptor;
  4. using Masuit.LuceneEFCore.SearchEngine;
  5. using Masuit.MyBlogs.Core.Infrastructure.Repository.Interface;
  6. using Masuit.Tools.Core.AspNetCore;
  7. using Masuit.Tools.Models;
  8. using Masuit.Tools.Systems;
  9. using Microsoft.EntityFrameworkCore;
  10. using System.Linq.Expressions;
  11. using Z.EntityFramework.Plus;
  12. namespace Masuit.MyBlogs.Core.Infrastructure.Repository
  13. {
  14. /// <summary>
  15. /// DAL基类
  16. /// </summary>
  17. /// <typeparam name="T">实体类型</typeparam>
  18. public abstract class BaseRepository<T> : Disposable, IBaseRepository<T> where T : LuceneIndexableBaseEntity
  19. {
  20. public virtual DataContext DataContext { get; set; }
  21. public MapperConfiguration MapperConfig { get; set; }
  22. /// <summary>
  23. /// 获取所有实体
  24. /// </summary>
  25. /// <returns>还未执行的SQL语句</returns>
  26. public virtual IQueryable<T> GetAll()
  27. {
  28. return DataContext.Set<T>();
  29. }
  30. /// <summary>
  31. /// 获取所有实体(不跟踪)
  32. /// </summary>
  33. /// <returns>还未执行的SQL语句</returns>
  34. public virtual IQueryable<T> GetAllNoTracking()
  35. {
  36. return DataContext.Set<T>().AsNoTracking();
  37. }
  38. /// <summary>
  39. /// 从二级缓存获取所有实体
  40. /// </summary>
  41. /// <returns></returns>
  42. public virtual IEnumerable<T> GetAllFromCache()
  43. {
  44. return DataContext.Set<T>().Cacheable().AsEnumerable();
  45. }
  46. /// <summary>
  47. /// 从二级缓存获取所有实体
  48. /// </summary>
  49. /// <returns></returns>
  50. public Task<List<T>> GetAllFromCacheAsync()
  51. {
  52. return DataContext.Set<T>().Cacheable().ToListAsync();
  53. }
  54. /// <summary>
  55. /// 获取所有实体(不跟踪)
  56. /// </summary>
  57. /// <typeparam name="TDto">映射实体</typeparam>
  58. /// <returns>还未执行的SQL语句</returns>
  59. public virtual IQueryable<TDto> GetAll<TDto>() where TDto : class
  60. {
  61. return DataContext.Set<T>().AsNoTracking().ProjectTo<TDto>(MapperConfig);
  62. }
  63. /// <summary>
  64. /// 从二级缓存获取所有实体(不跟踪)
  65. /// </summary>
  66. /// <typeparam name="TDto">映射实体</typeparam>
  67. /// <returns></returns>
  68. public virtual List<TDto> GetAllFromCache<TDto>() where TDto : class
  69. {
  70. return DataContext.Set<T>().AsNoTracking().ProjectTo<TDto>(MapperConfig).Cacheable().ToList();
  71. }
  72. /// <summary>
  73. /// 从二级缓存获取所有实体(不跟踪)
  74. /// </summary>
  75. /// <typeparam name="TDto">映射实体</typeparam>
  76. /// <returns></returns>
  77. public Task<List<TDto>> GetAllFromCacheAsync<TDto>() where TDto : class
  78. {
  79. return DataContext.Set<T>().AsNoTracking().ProjectTo<TDto>(MapperConfig).Cacheable().ToListAsync();
  80. }
  81. /// <summary>
  82. /// 获取所有实体
  83. /// </summary>
  84. /// <typeparam name="TS">排序</typeparam>
  85. /// <param name="orderby">排序字段</param>
  86. /// <param name="isAsc">是否升序</param>
  87. /// <returns>还未执行的SQL语句</returns>
  88. public virtual IOrderedQueryable<T> GetAll<TS>(Expression<Func<T, TS>> orderby, bool isAsc = true)
  89. {
  90. return isAsc ? DataContext.Set<T>().OrderBy(orderby) : DataContext.Set<T>().OrderByDescending(orderby);
  91. }
  92. /// <summary>
  93. /// 获取所有实体(不跟踪)
  94. /// </summary>
  95. /// <typeparam name="TS">排序</typeparam>
  96. /// <param name="orderby">排序字段</param>
  97. /// <param name="isAsc">是否升序</param>
  98. /// <returns>还未执行的SQL语句</returns>
  99. public virtual IOrderedQueryable<T> GetAllNoTracking<TS>(Expression<Func<T, TS>> orderby, bool isAsc = true)
  100. {
  101. return isAsc ? DataContext.Set<T>().AsNoTracking().OrderBy(orderby) : DataContext.Set<T>().AsNoTracking().OrderByDescending(orderby);
  102. }
  103. /// <summary>
  104. /// 从二级缓存获取所有实体
  105. /// </summary>
  106. /// <typeparam name="TS">排序</typeparam>
  107. /// <param name="orderby">排序字段</param>
  108. /// <param name="isAsc">是否升序</param>
  109. /// <returns></returns>
  110. public virtual List<T> GetAllFromCache<TS>(Expression<Func<T, TS>> orderby, bool isAsc = true)
  111. {
  112. return GetAll(orderby, isAsc).Cacheable().ToList();
  113. }
  114. /// <summary>
  115. /// 从二级缓存获取所有实体
  116. /// </summary>
  117. /// <typeparam name="TS">排序</typeparam>
  118. /// <param name="orderby">排序字段</param>
  119. /// <param name="isAsc">是否升序</param>
  120. /// <returns></returns>
  121. public Task<List<T>> GetAllFromCacheAsync<TS>(Expression<Func<T, TS>> @orderby, bool isAsc = true)
  122. {
  123. return GetAll(orderby, isAsc).Cacheable().ToListAsync();
  124. }
  125. /// <summary>
  126. /// 获取所有实体
  127. /// </summary>
  128. /// <typeparam name="TS">排序</typeparam>
  129. /// <typeparam name="TDto">映射实体</typeparam>
  130. /// <param name="orderby">排序字段</param>
  131. /// <param name="isAsc">是否升序</param>
  132. /// <returns>还未执行的SQL语句</returns>
  133. public virtual IQueryable<TDto> GetAll<TS, TDto>(Expression<Func<T, TS>> orderby, bool isAsc = true) where TDto : class
  134. {
  135. return GetAllNoTracking(orderby, isAsc).ProjectTo<TDto>(MapperConfig);
  136. }
  137. /// <summary>
  138. /// 从二级缓存获取所有实体
  139. /// </summary>
  140. /// <typeparam name="TS">排序</typeparam>
  141. /// <typeparam name="TDto">映射实体</typeparam>
  142. /// <param name="orderby">排序字段</param>
  143. /// <param name="isAsc">是否升序</param>
  144. /// <returns>还未执行的SQL语句</returns>
  145. public virtual List<TDto> GetAllFromCache<TS, TDto>(Expression<Func<T, TS>> orderby, bool isAsc = true) where TDto : class
  146. {
  147. return GetAllNoTracking(orderby, isAsc).ProjectTo<TDto>(MapperConfig).Cacheable().ToList();
  148. }
  149. /// <summary>
  150. /// 从二级缓存获取所有实体
  151. /// </summary>
  152. /// <typeparam name="TS">排序</typeparam>
  153. /// <typeparam name="TDto">映射实体</typeparam>
  154. /// <param name="orderby">排序字段</param>
  155. /// <param name="isAsc">是否升序</param>
  156. /// <returns></returns>
  157. public Task<List<TDto>> GetAllFromCacheAsync<TS, TDto>(Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class
  158. {
  159. return GetAllNoTracking(orderby, isAsc).ProjectTo<TDto>(MapperConfig).Cacheable().ToListAsync();
  160. }
  161. /// <summary>
  162. /// 基本查询方法,获取一个集合
  163. /// </summary>
  164. /// <param name="where">查询条件</param>
  165. /// <returns>还未执行的SQL语句</returns>
  166. public virtual IQueryable<T> GetQuery(Expression<Func<T, bool>> where)
  167. {
  168. return DataContext.Set<T>().Where(where);
  169. }
  170. /// <summary>
  171. /// 基本查询方法,获取一个集合
  172. /// </summary>
  173. /// <typeparam name="TS">排序</typeparam>
  174. /// <param name="where">查询条件</param>
  175. /// <param name="orderby">排序字段</param>
  176. /// <param name="isAsc">是否升序</param>
  177. /// <returns>还未执行的SQL语句</returns>
  178. public virtual IOrderedQueryable<T> GetQuery<TS>(Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc = true)
  179. {
  180. return isAsc ? DataContext.Set<T>().Where(where).OrderBy(orderby) : DataContext.Set<T>().Where(where).OrderByDescending(orderby);
  181. }
  182. /// <summary>
  183. /// 基本查询方法,获取一个集合,优先从二级缓存读取
  184. /// </summary>
  185. /// <param name="where">查询条件</param>
  186. /// <returns></returns>
  187. public virtual List<T> GetQueryFromCache(Expression<Func<T, bool>> @where)
  188. {
  189. return DataContext.Set<T>().Where(where).Cacheable().ToList();
  190. }
  191. /// <summary>
  192. /// 基本查询方法,获取一个集合,优先从二级缓存读取
  193. /// </summary>
  194. /// <param name="where">查询条件</param>
  195. /// <returns></returns>
  196. public Task<List<T>> GetQueryFromCacheAsync(Expression<Func<T, bool>> @where)
  197. {
  198. return DataContext.Set<T>().Where(where).Cacheable().ToListAsync();
  199. }
  200. /// <summary>
  201. /// 基本查询方法,获取一个集合,优先从二级缓存读取
  202. /// </summary>
  203. /// <typeparam name="TS">排序字段</typeparam>
  204. /// <param name="where">查询条件</param>
  205. /// <param name="orderby">排序方式</param>
  206. /// <param name="isAsc">是否升序</param>
  207. /// <returns></returns>
  208. public virtual List<T> GetQueryFromCache<TS>(Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc = true)
  209. {
  210. return GetQuery(where, orderby, isAsc).Cacheable().ToList();
  211. }
  212. /// <summary>
  213. /// 基本查询方法,获取一个集合,优先从二级缓存读取
  214. /// </summary>
  215. /// <typeparam name="TS">排序字段</typeparam>
  216. /// <param name="where">查询条件</param>
  217. /// <param name="orderby">排序方式</param>
  218. /// <param name="isAsc">是否升序</param>
  219. /// <returns></returns>
  220. public Task<List<T>> GetQueryFromCacheAsync<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
  221. {
  222. return GetQuery(where, orderby, isAsc).Cacheable().ToListAsync();
  223. }
  224. /// <summary>
  225. /// 基本查询方法,获取一个被AutoMapper映射后的集合,优先从二级缓存读取
  226. /// </summary>
  227. /// <typeparam name="TS">排序字段</typeparam>
  228. /// <typeparam name="TDto">输出类型</typeparam>
  229. /// <param name="where">查询条件</param>
  230. /// <param name="orderby">排序方式</param>
  231. /// <param name="isAsc">是否升序</param>
  232. /// <returns></returns>
  233. public Task<List<TDto>> GetQueryFromCacheAsync<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class
  234. {
  235. return GetQueryNoTracking(where, orderby, isAsc).ProjectTo<TDto>(MapperConfig).Cacheable().ToListAsync();
  236. }
  237. /// <summary>
  238. /// 基本查询方法,获取一个集合(不跟踪实体)
  239. /// </summary>
  240. /// <param name="where">查询条件</param>
  241. /// <returns>还未执行的SQL语句</returns>
  242. public virtual IQueryable<T> GetQueryNoTracking(Expression<Func<T, bool>> where)
  243. {
  244. return DataContext.Set<T>().Where(where).AsNoTracking();
  245. }
  246. /// <summary>
  247. /// 基本查询方法,获取一个集合(不跟踪实体)
  248. /// </summary>
  249. /// <typeparam name="TS">排序字段</typeparam>
  250. /// <param name="where">查询条件</param>
  251. /// <param name="orderby">排序方式</param>
  252. /// <param name="isAsc">是否升序</param>
  253. /// <returns>还未执行的SQL语句</returns>
  254. public virtual IOrderedQueryable<T> GetQueryNoTracking<TS>(Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc = true)
  255. {
  256. return isAsc ? DataContext.Set<T>().Where(where).AsNoTracking().OrderBy(orderby) : DataContext.Set<T>().Where(where).AsNoTracking().OrderByDescending(orderby);
  257. }
  258. /// <summary>
  259. /// 基本查询方法,获取一个被AutoMapper映射后的集合(不跟踪实体)
  260. /// </summary>
  261. /// <param name="where">查询条件</param>
  262. /// <returns>还未执行的SQL语句</returns>
  263. public virtual IQueryable<TDto> GetQuery<TDto>(Expression<Func<T, bool>> where) where TDto : class
  264. {
  265. return DataContext.Set<T>().Where(where).AsNoTracking().ProjectTo<TDto>(MapperConfig);
  266. }
  267. /// <summary>
  268. /// 基本查询方法,获取一个被AutoMapper映射后的集合(不跟踪实体)
  269. /// </summary>
  270. /// <typeparam name="TS">排序字段</typeparam>
  271. /// <typeparam name="TDto">输出类型</typeparam>
  272. /// <param name="where">查询条件</param>
  273. /// <param name="orderby">排序方式</param>
  274. /// <param name="isAsc">是否升序</param>
  275. /// <returns>还未执行的SQL语句</returns>
  276. public virtual IQueryable<TDto> GetQuery<TS, TDto>(Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc = true) where TDto : class
  277. {
  278. return GetQueryNoTracking(where, orderby, isAsc).ProjectTo<TDto>(MapperConfig);
  279. }
  280. /// <summary>
  281. /// 基本查询方法,获取一个被AutoMapper映射后的集合,优先从二级缓存读取(不跟踪实体)
  282. /// </summary>
  283. /// <param name="where">查询条件</param>
  284. /// <returns>实体集合</returns>
  285. public virtual List<TDto> GetQueryFromCache<TDto>(Expression<Func<T, bool>> where) where TDto : class
  286. {
  287. return DataContext.Set<T>().Where(where).AsNoTracking().ProjectTo<TDto>(MapperConfig).Cacheable().ToList();
  288. }
  289. /// <summary>
  290. /// 基本查询方法,获取一个被AutoMapper映射后的集合,优先从二级缓存读取
  291. /// </summary>
  292. /// <param name="where">查询条件</param>
  293. /// <returns></returns>
  294. public Task<List<TDto>> GetQueryFromCacheAsync<TDto>(Expression<Func<T, bool>> @where) where TDto : class
  295. {
  296. return DataContext.Set<T>().Where(where).AsNoTracking().ProjectTo<TDto>(MapperConfig).Cacheable().ToListAsync();
  297. }
  298. /// <summary>
  299. /// 基本查询方法,获取一个被AutoMapper映射后的集合,优先从二级缓存读取(不跟踪实体)
  300. /// </summary>
  301. /// <typeparam name="TS">排序字段</typeparam>
  302. /// <typeparam name="TDto">输出类型</typeparam>
  303. /// <param name="where">查询条件</param>
  304. /// <param name="orderby">排序方式</param>
  305. /// <param name="isAsc">是否升序</param>
  306. /// <returns></returns>
  307. public virtual List<TDto> GetQueryFromCache<TS, TDto>(Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc = true) where TDto : class
  308. {
  309. return GetQueryNoTracking(where, orderby, isAsc).ProjectTo<TDto>(MapperConfig).Cacheable().ToList();
  310. }
  311. /// <summary>
  312. /// 获取第一条数据
  313. /// </summary>
  314. /// <param name="where">查询条件</param>
  315. /// <returns>实体</returns>
  316. public virtual T Get(Expression<Func<T, bool>> where)
  317. {
  318. return EF.CompileQuery((DataContext ctx) => ctx.Set<T>().FirstOrDefault(where))(DataContext);
  319. }
  320. /// <summary>
  321. /// 获取第一条数据
  322. /// </summary>
  323. /// <param name="where">查询条件</param>
  324. /// <returns>实体</returns>
  325. public virtual T GetFromCache(Expression<Func<T, bool>> where)
  326. {
  327. return DataContext.Set<T>().Where(where).DeferredFirstOrDefault().Execute();
  328. }
  329. /// <summary>
  330. /// 获取第一条数据
  331. /// </summary>
  332. /// <param name="where">查询条件</param>
  333. /// <returns>实体</returns>
  334. public Task<T> GetFromCacheAsync(Expression<Func<T, bool>> @where)
  335. {
  336. return DataContext.Set<T>().Where(where).DeferredFirstOrDefault().ExecuteAsync();
  337. }
  338. /// <summary>
  339. /// 获取第一条数据
  340. /// </summary>
  341. /// <typeparam name="TS">排序</typeparam>
  342. /// <param name="where">查询条件</param>
  343. /// <param name="orderby">排序字段</param>
  344. /// <param name="isAsc">是否升序</param>
  345. /// <returns>实体</returns>
  346. public virtual T Get<TS>(Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc = true)
  347. {
  348. return isAsc ? EF.CompileQuery((DataContext ctx) => ctx.Set<T>().OrderBy(orderby).FirstOrDefault(where))(DataContext) : EF.CompileQuery((DataContext ctx) => ctx.Set<T>().OrderByDescending(orderby).FirstOrDefault(where))(DataContext);
  349. }
  350. /// <summary>
  351. /// 获取第一条数据
  352. /// </summary>
  353. /// <typeparam name="TS">排序</typeparam>
  354. /// <param name="where">查询条件</param>
  355. /// <param name="orderby">排序字段</param>
  356. /// <param name="isAsc">是否升序</param>
  357. /// <returns>实体</returns>
  358. public virtual T GetFromCache<TS>(Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc = true)
  359. {
  360. return isAsc ? DataContext.Set<T>().OrderBy(orderby).Where(where).DeferredFirstOrDefault().Execute() : DataContext.Set<T>().OrderByDescending(orderby).Where(where).DeferredFirstOrDefault().Execute();
  361. }
  362. /// <summary>
  363. /// 获取第一条数据
  364. /// </summary>
  365. /// <typeparam name="TS">排序</typeparam>
  366. /// <param name="where">查询条件</param>
  367. /// <param name="orderby">排序字段</param>
  368. /// <param name="isAsc">是否升序</param>
  369. /// <returns>实体</returns>
  370. public Task<T> GetFromCacheAsync<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
  371. {
  372. return isAsc ? DataContext.Set<T>().OrderBy(orderby).Where(where).DeferredFirstOrDefault().ExecuteAsync() : DataContext.Set<T>().OrderByDescending(orderby).Where(where).DeferredFirstOrDefault().ExecuteAsync();
  373. }
  374. /// <summary>
  375. /// 获取第一条被AutoMapper映射后的数据(不跟踪)
  376. /// </summary>
  377. /// <typeparam name="TS">排序</typeparam>
  378. /// <typeparam name="TDto">映射实体</typeparam>
  379. /// <param name="where">查询条件</param>
  380. /// <param name="orderby">排序字段</param>
  381. /// <param name="isAsc">是否升序</param>
  382. /// <returns>映射实体</returns>
  383. public Task<TDto> GetAsync<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class
  384. {
  385. return isAsc ? DataContext.Set<T>().Where(where).OrderBy(orderby).AsNoTracking().ProjectTo<TDto>(MapperConfig).FirstOrDefaultAsync() : DataContext.Set<T>().Where(where).OrderByDescending(orderby).AsNoTracking().ProjectTo<TDto>(MapperConfig).FirstOrDefaultAsync();
  386. }
  387. /// <summary>
  388. /// 获取第一条被AutoMapper映射后的数据(不跟踪)
  389. /// </summary>
  390. /// <typeparam name="TS">排序</typeparam>
  391. /// <typeparam name="TDto">映射实体</typeparam>
  392. /// <param name="where">查询条件</param>
  393. /// <param name="orderby">排序字段</param>
  394. /// <param name="isAsc">是否升序</param>
  395. /// <returns>映射实体</returns>
  396. public virtual TDto GetFromCache<TS, TDto>(Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc = true) where TDto : class
  397. {
  398. return isAsc ? DataContext.Set<T>().Where(where).OrderBy(orderby).ProjectTo<TDto>(MapperConfig).DeferredFirstOrDefault().Execute() : DataContext.Set<T>().Where(where).OrderByDescending(orderby).ProjectTo<TDto>(MapperConfig).DeferredFirstOrDefault().Execute();
  399. }
  400. /// <summary>
  401. /// 获取第一条被AutoMapper映射后的数据
  402. /// </summary>
  403. /// <typeparam name="TS">排序</typeparam>
  404. /// <typeparam name="TDto">映射实体</typeparam>
  405. /// <param name="where">查询条件</param>
  406. /// <param name="orderby">排序字段</param>
  407. /// <param name="isAsc">是否升序</param>
  408. /// <returns>映射实体</returns>
  409. public Task<TDto> GetFromCacheAsync<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class
  410. {
  411. return isAsc ? DataContext.Set<T>().Where(where).OrderBy(orderby).ProjectTo<TDto>(MapperConfig).DeferredFirstOrDefault().ExecuteAsync() : DataContext.Set<T>().Where(where).OrderByDescending(orderby).ProjectTo<TDto>(MapperConfig).DeferredFirstOrDefault().ExecuteAsync();
  412. }
  413. /// <summary>
  414. /// 获取第一条数据
  415. /// </summary>
  416. /// <param name="where">查询条件</param>
  417. /// <returns>实体</returns>
  418. public virtual Task<T> GetAsync(Expression<Func<T, bool>> where)
  419. {
  420. return EF.CompileAsyncQuery((DataContext ctx) => ctx.Set<T>().FirstOrDefault(where))(DataContext);
  421. }
  422. /// <summary>
  423. /// 获取第一条数据
  424. /// </summary>
  425. /// <typeparam name="TS">排序</typeparam>
  426. /// <param name="where">查询条件</param>
  427. /// <param name="orderby">排序字段</param>
  428. /// <param name="isAsc">是否升序</param>
  429. /// <returns>实体</returns>
  430. public virtual Task<T> GetAsync<TS>(Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc = true)
  431. {
  432. return isAsc ? EF.CompileAsyncQuery((DataContext ctx) => ctx.Set<T>().OrderBy(orderby).FirstOrDefault(where))(DataContext) : EF.CompileAsyncQuery((DataContext ctx) => ctx.Set<T>().OrderByDescending(orderby).FirstOrDefault(where))(DataContext);
  433. }
  434. /// <summary>
  435. /// 获取第一条数据(不跟踪实体)
  436. /// </summary>
  437. /// <param name="where">查询条件</param>
  438. /// <returns>实体</returns>
  439. public virtual T GetNoTracking(Expression<Func<T, bool>> where)
  440. {
  441. return EF.CompileQuery((DataContext ctx) => ctx.Set<T>().AsNoTracking().FirstOrDefault(where))(DataContext);
  442. }
  443. /// <summary>
  444. /// 获取第一条数据(不跟踪实体)
  445. /// </summary>
  446. /// <typeparam name="TS">排序</typeparam>
  447. /// <param name="where">查询条件</param>
  448. /// <param name="orderby">排序字段</param>
  449. /// <param name="isAsc">是否升序</param>
  450. /// <returns>实体</returns>
  451. public virtual T GetNoTracking<TS>(Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc = true)
  452. {
  453. return isAsc ? EF.CompileQuery((DataContext ctx) => ctx.Set<T>().AsNoTracking().OrderBy(orderby).FirstOrDefault(where))(DataContext) : EF.CompileQuery((DataContext ctx) => ctx.Set<T>().AsNoTracking().OrderByDescending(orderby).FirstOrDefault(where))(DataContext);
  454. }
  455. /// <summary>
  456. /// 获取第一条被AutoMapper映射后的数据(不跟踪实体)
  457. /// </summary>
  458. /// <param name="where">查询条件</param>
  459. /// <returns>实体</returns>
  460. public virtual TDto Get<TDto>(Expression<Func<T, bool>> where) where TDto : class
  461. {
  462. return DataContext.Set<T>().Where(where).AsNoTracking().ProjectTo<TDto>(MapperConfig).FirstOrDefault();
  463. }
  464. /// <summary>
  465. /// 获取第一条被AutoMapper映射后的数据
  466. /// </summary>
  467. /// <param name="where">查询条件</param>
  468. /// <returns>实体</returns>
  469. public virtual TDto GetFromCache<TDto>(Expression<Func<T, bool>> where) where TDto : class
  470. {
  471. return DataContext.Set<T>().Where(where).ProjectTo<TDto>(MapperConfig).DeferredFirstOrDefault().Execute();
  472. }
  473. /// <summary>
  474. /// 获取第一条被AutoMapper映射后的数据
  475. /// </summary>
  476. /// <param name="where">查询条件</param>
  477. /// <returns>实体</returns>
  478. public Task<TDto> GetFromCacheAsync<TDto>(Expression<Func<T, bool>> @where) where TDto : class
  479. {
  480. return DataContext.Set<T>().Where(where).ProjectTo<TDto>(MapperConfig).DeferredFirstOrDefault().ExecuteAsync();
  481. }
  482. /// <summary>
  483. /// 获取第一条被AutoMapper映射后的数据(不跟踪实体)
  484. /// </summary>
  485. /// <typeparam name="TDto">映射实体</typeparam>
  486. /// <typeparam name="TS">排序</typeparam>
  487. /// <param name="where">查询条件</param>
  488. /// <param name="orderby">排序字段</param>
  489. /// <param name="isAsc">是否升序</param>
  490. /// <returns>实体</returns>
  491. public virtual TDto Get<TS, TDto>(Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc = true) where TDto : class
  492. {
  493. return isAsc ? DataContext.Set<T>().Where(where).OrderBy(orderby).AsNoTracking().ProjectTo<TDto>(MapperConfig).FirstOrDefault() : DataContext.Set<T>().Where(where).OrderByDescending(orderby).AsNoTracking().ProjectTo<TDto>(MapperConfig).FirstOrDefault();
  494. }
  495. /// <summary>
  496. /// 获取第一条数据(异步,不跟踪实体)
  497. /// </summary>
  498. /// <param name="where">查询条件</param>
  499. /// <returns>实体</returns>
  500. public virtual Task<T> GetNoTrackingAsync(Expression<Func<T, bool>> where)
  501. {
  502. return EF.CompileAsyncQuery((DataContext ctx) => ctx.Set<T>().AsNoTracking().FirstOrDefault(@where))(DataContext);
  503. }
  504. /// <summary>
  505. /// 获取第一条数据(异步,不跟踪实体)
  506. /// </summary>
  507. /// <typeparam name="TS">排序</typeparam>
  508. /// <param name="where">查询条件</param>
  509. /// <param name="orderby">排序字段</param>
  510. /// <param name="isAsc">是否升序</param>
  511. /// <returns>实体</returns>
  512. public virtual Task<T> GetNoTrackingAsync<TS>(Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc = true)
  513. {
  514. return isAsc ? EF.CompileAsyncQuery((DataContext ctx) => ctx.Set<T>().OrderBy(orderby).AsNoTracking().FirstOrDefault(where))(DataContext) : EF.CompileAsyncQuery((DataContext ctx) => ctx.Set<T>().OrderByDescending(orderby).AsNoTracking().FirstOrDefault(where))(DataContext);
  515. }
  516. /// <summary>
  517. /// 根据ID找实体
  518. /// </summary>
  519. /// <param name="id">实体id</param>
  520. /// <returns>实体</returns>
  521. public virtual T GetById(int id)
  522. {
  523. return EF.CompileQuery((DataContext ctx, int xid) => ctx.Set<T>().FirstOrDefault(t => t.Id == xid))(DataContext, id);
  524. }
  525. /// <summary>
  526. /// 根据ID找实体(异步)
  527. /// </summary>
  528. /// <param name="id">实体id</param>
  529. /// <returns>实体</returns>
  530. public virtual Task<T> GetByIdAsync(int id)
  531. {
  532. return EF.CompileAsyncQuery((DataContext ctx, int xid) => ctx.Set<T>().FirstOrDefault(t => t.Id == xid))(DataContext, id);
  533. }
  534. /// <summary>
  535. /// 高效分页查询方法
  536. /// </summary>
  537. /// <typeparam name="TS"></typeparam>
  538. /// <param name="pageIndex">第几页</param>
  539. /// <param name="pageSize">每页大小</param>
  540. /// <param name="where">where Lambda条件表达式</param>
  541. /// <param name="orderby">orderby Lambda条件表达式</param>
  542. /// <param name="isAsc">升序降序</param>
  543. /// <returns></returns>
  544. public virtual PagedList<T> GetPages<TS>(int pageIndex, int pageSize, Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc)
  545. {
  546. return isAsc ? DataContext.Set<T>().Where(where).NotCacheable().OrderBy(orderby).ToPagedList(pageIndex, pageSize) : DataContext.Set<T>().Where(where).NotCacheable().OrderByDescending(orderby).ToPagedList(pageIndex, pageSize);
  547. }
  548. /// <summary>
  549. /// 高效分页查询方法
  550. /// </summary>
  551. /// <typeparam name="TS"></typeparam>
  552. /// <param name="pageIndex">第几页</param>
  553. /// <param name="pageSize">每页大小</param>
  554. /// <param name="where">where Lambda条件表达式</param>
  555. /// <param name="orderby">orderby Lambda条件表达式</param>
  556. /// <param name="isAsc">升序降序</param>
  557. /// <returns></returns>
  558. public virtual Task<PagedList<T>> GetPagesAsync<TS>(int pageIndex, int pageSize, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> orderby, bool isAsc)
  559. {
  560. return isAsc ? DataContext.Set<T>().Where(where).NotCacheable().OrderBy(orderby).ToPagedListAsync(pageIndex, pageSize) : DataContext.Set<T>().Where(where).NotCacheable().OrderByDescending(orderby).ToPagedListAsync(pageIndex, pageSize);
  561. }
  562. /// <summary>
  563. /// 高效分页查询方法,优先从二级缓存读取
  564. /// </summary>
  565. /// <typeparam name="TS"></typeparam>
  566. /// <param name="pageIndex">第几页</param>
  567. /// <param name="pageSize">每页大小</param>
  568. /// <param name="where">where Lambda条件表达式</param>
  569. /// <param name="orderby">orderby Lambda条件表达式</param>
  570. /// <param name="isAsc">升序降序</param>
  571. /// <returns></returns>
  572. public virtual PagedList<T> GetPagesFromCache<TS>(int pageIndex, int pageSize, Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc)
  573. {
  574. var temp = DataContext.Set<T>().Where(where);
  575. return isAsc ? temp.OrderBy(orderby).ToCachedPagedList(pageIndex, pageSize) : temp.OrderByDescending(orderby).ToCachedPagedList(pageIndex, pageSize);
  576. }
  577. /// <summary>
  578. /// 高效分页查询方法,优先从二级缓存读取
  579. /// </summary>
  580. /// <typeparam name="TS"></typeparam>
  581. /// <param name="pageIndex">第几页</param>
  582. /// <param name="pageSize">每页大小</param>
  583. /// <param name="where">where Lambda条件表达式</param>
  584. /// <param name="orderby">orderby Lambda条件表达式</param>
  585. /// <param name="isAsc">升序降序</param>
  586. /// <returns></returns>
  587. public virtual Task<PagedList<T>> GetPagesFromCacheAsync<TS>(int pageIndex, int pageSize, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc)
  588. {
  589. var temp = DataContext.Set<T>().Where(where);
  590. return isAsc ? temp.OrderBy(orderby).ToCachedPagedListAsync(pageIndex, pageSize) : temp.OrderByDescending(orderby).ToCachedPagedListAsync(pageIndex, pageSize);
  591. }
  592. /// <summary>
  593. /// 高效分页查询方法,优先从二级缓存读取,取出被AutoMapper映射后的数据集合
  594. /// </summary>
  595. /// <typeparam name="TS"></typeparam>
  596. /// <typeparam name="TDto"></typeparam>
  597. /// <param name="pageIndex">第几页</param>
  598. /// <param name="pageSize">每页大小</param>
  599. /// <param name="where">where Lambda条件表达式</param>
  600. /// <param name="orderby">orderby Lambda条件表达式</param>
  601. /// <param name="isAsc">升序降序</param>
  602. /// <returns></returns>
  603. public Task<PagedList<TDto>> GetPagesFromCacheAsync<TS, TDto>(int pageIndex, int pageSize, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc) where TDto : class
  604. {
  605. var temp = DataContext.Set<T>().Where(where).AsNoTracking();
  606. return isAsc ? temp.OrderBy(orderby).ToCachedPagedListAsync<T, TDto>(pageIndex, pageSize, MapperConfig) : temp.OrderByDescending(orderby).ToCachedPagedListAsync<T, TDto>(pageIndex, pageSize, MapperConfig);
  607. }
  608. /// <summary>
  609. /// 高效分页查询方法(不跟踪实体)
  610. /// </summary>
  611. /// <typeparam name="TS"></typeparam>
  612. /// <param name="pageIndex">第几页</param>
  613. /// <param name="pageSize">每页大小</param>
  614. /// <param name="where">where Lambda条件表达式</param>
  615. /// <param name="orderby">orderby Lambda条件表达式</param>
  616. /// <param name="isAsc">升序降序</param>
  617. /// <returns></returns>
  618. public virtual PagedList<T> GetPagesNoTracking<TS>(int pageIndex, int pageSize, Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc = true)
  619. {
  620. return isAsc ? DataContext.Set<T>().Where(where).AsNoTracking().NotCacheable().OrderBy(orderby).ToPagedList(pageIndex, pageSize) : DataContext.Set<T>().Where(where).AsNoTracking().NotCacheable().OrderByDescending(orderby).ToPagedList(pageIndex, pageSize);
  621. }
  622. /// <summary>
  623. /// 高效分页查询方法,取出被AutoMapper映射后的数据集合(不跟踪实体)
  624. /// </summary>
  625. /// <typeparam name="TS"></typeparam>
  626. /// <typeparam name="TDto"></typeparam>
  627. /// <param name="pageIndex">第几页</param>
  628. /// <param name="pageSize">每页大小</param>
  629. /// <param name="where">where Lambda条件表达式</param>
  630. /// <param name="orderby">orderby Lambda条件表达式</param>
  631. /// <param name="isAsc">升序降序</param>
  632. /// <returns></returns>
  633. public virtual PagedList<TDto> GetPages<TS, TDto>(int pageIndex, int pageSize, Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc = true) where TDto : class
  634. {
  635. return isAsc ? DataContext.Set<T>().Where(where).AsNoTracking().OrderBy(orderby).ToPagedList<T, TDto>(pageIndex, pageSize, MapperConfig) : DataContext.Set<T>().Where(where).AsNoTracking().OrderByDescending(orderby).ToPagedList<T, TDto>(pageIndex, pageSize, MapperConfig);
  636. }
  637. /// <summary>
  638. /// 高效分页查询方法,取出被AutoMapper映射后的数据集合
  639. /// </summary>
  640. /// <typeparam name="TS"></typeparam>
  641. /// <typeparam name="TDto"></typeparam>
  642. /// <param name="pageIndex">第几页</param>
  643. /// <param name="pageSize">每页大小</param>
  644. /// <param name="where">where Lambda条件表达式</param>
  645. /// <param name="orderby">orderby Lambda条件表达式</param>
  646. /// <param name="isAsc">升序降序</param>
  647. /// <returns></returns>
  648. public Task<PagedList<TDto>> GetPagesAsync<TS, TDto>(int pageIndex, int pageSize, Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc) where TDto : class
  649. {
  650. return isAsc ? DataContext.Set<T>().Where(where).AsNoTracking().OrderBy(orderby).ToPagedListAsync<T, TDto>(pageIndex, pageSize, MapperConfig) : DataContext.Set<T>().Where(where).AsNoTracking().OrderByDescending(orderby).ToPagedListAsync<T, TDto>(pageIndex, pageSize, MapperConfig);
  651. }
  652. /// <summary>
  653. /// 高效分页查询方法,取出被AutoMapper映射后的数据集合,优先从缓存读取(不跟踪实体)
  654. /// </summary>
  655. /// <typeparam name="TS"></typeparam>
  656. /// <typeparam name="TDto"></typeparam>
  657. /// <param name="pageIndex">第几页</param>
  658. /// <param name="pageSize">每页大小</param>
  659. /// <param name="where">where Lambda条件表达式</param>
  660. /// <param name="orderby">orderby Lambda条件表达式</param>
  661. /// <param name="isAsc">升序降序</param>
  662. /// <returns></returns>
  663. public virtual PagedList<TDto> GetPagesFromCache<TS, TDto>(int pageIndex, int pageSize, Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc = true) where TDto : class
  664. {
  665. var temp = DataContext.Set<T>().Where(where).AsNoTracking();
  666. return isAsc ? temp.OrderBy(orderby).ToCachedPagedList<T, TDto>(pageIndex, pageSize, MapperConfig) : temp.OrderByDescending(orderby).ToCachedPagedList<T, TDto>(pageIndex, pageSize, MapperConfig);
  667. }
  668. /// <summary>
  669. /// 根据ID删除实体
  670. /// </summary>
  671. /// <param name="id">实体id</param>
  672. /// <returns>删除成功</returns>
  673. public virtual bool DeleteById(int id)
  674. {
  675. return DataContext.Set<T>().Where(t => t.Id == id).Delete() > 0;
  676. }
  677. /// <summary>
  678. /// 根据ID删除实体
  679. /// </summary>
  680. /// <param name="id">实体id</param>
  681. /// <returns>删除成功</returns>
  682. public virtual Task<int> DeleteByIdAsync(int id)
  683. {
  684. return DataContext.Set<T>().Where(t => t.Id == id).DeleteAsync();
  685. }
  686. /// <summary>
  687. /// 删除实体
  688. /// </summary>
  689. /// <param name="t">需要删除的实体</param>
  690. /// <returns>删除成功</returns>
  691. public virtual bool DeleteEntity(T t)
  692. {
  693. DataContext.Entry(t).State = EntityState.Unchanged;
  694. DataContext.Entry(t).State = EntityState.Deleted;
  695. DataContext.Remove(t);
  696. return true;
  697. }
  698. /// <summary>
  699. /// 根据条件删除实体
  700. /// </summary>
  701. /// <param name="where">查询条件</param>
  702. /// <returns>删除成功</returns>
  703. public virtual int DeleteEntity(Expression<Func<T, bool>> where)
  704. {
  705. return DataContext.Set<T>().Where(where).Delete();
  706. }
  707. /// <summary>
  708. /// 根据条件删除实体(异步)
  709. /// </summary>
  710. /// <param name="where">查询条件</param>
  711. /// <returns>删除成功</returns>
  712. public virtual Task<int> DeleteEntityAsync(Expression<Func<T, bool>> where)
  713. {
  714. return DataContext.Set<T>().Where(where).DeleteAsync();
  715. }
  716. /// <summary>
  717. /// 添加实体
  718. /// </summary>
  719. /// <param name="t">需要添加的实体</param>
  720. /// <returns>添加成功</returns>
  721. public abstract T AddEntity(T t);
  722. /// <summary>
  723. /// 添加或更新实体
  724. /// </summary>
  725. /// <param name="key">更新键规则</param>
  726. /// <param name="t">需要保存的实体</param>
  727. /// <returns>保存成功</returns>
  728. public T AddOrUpdate<TKey>(Expression<Func<T, TKey>> key, T t)
  729. {
  730. DataContext.Set<T>().AddOrUpdate(key, t);
  731. return t;
  732. }
  733. /// <summary>
  734. /// 添加或更新实体
  735. /// </summary>
  736. /// <param name="key">更新键规则</param>
  737. /// <param name="entities">需要保存的实体</param>
  738. /// <returns>保存成功</returns>
  739. public void AddOrUpdate<TKey>(Expression<Func<T, TKey>> key, params T[] entities)
  740. {
  741. DataContext.Set<T>().AddOrUpdate(key, entities);
  742. }
  743. /// <summary>
  744. /// 添加或更新实体
  745. /// </summary>
  746. /// <param name="key">更新键规则</param>
  747. /// <param name="entities">需要保存的实体</param>
  748. /// <returns>保存成功</returns>
  749. public void AddOrUpdate<TKey>(Expression<Func<T, TKey>> key, IEnumerable<T> entities)
  750. {
  751. DataContext.Set<T>().AddOrUpdate(key, entities);
  752. }
  753. /// <summary>
  754. /// 统一保存数据
  755. /// </summary>
  756. /// <returns>受影响的行数</returns>
  757. public virtual int SaveChanges()
  758. {
  759. return DataContext.SaveChanges();
  760. }
  761. /// <summary>
  762. /// 统一保存数据(异步)
  763. /// </summary>
  764. /// <returns>受影响的行数</returns>
  765. public virtual Task<int> SaveChangesAsync()
  766. {
  767. return DataContext.SaveChangesAsync();
  768. }
  769. /// <summary>
  770. /// 判断实体是否在数据库中存在
  771. /// </summary>
  772. /// <param name="where">查询条件</param>
  773. /// <returns>是否存在</returns>
  774. public virtual bool Any(Expression<Func<T, bool>> where)
  775. {
  776. return EF.CompileQuery((DataContext ctx) => ctx.Set<T>().Any(where))(DataContext);
  777. }
  778. /// <summary>
  779. /// 符合条件的个数
  780. /// </summary>
  781. /// <param name="where">查询条件</param>
  782. /// <returns>是否存在</returns>
  783. public virtual int Count(Expression<Func<T, bool>> where)
  784. {
  785. return EF.CompileQuery((DataContext ctx) => ctx.Set<T>().Count(where))(DataContext);
  786. }
  787. /// <summary>
  788. /// 删除多个实体
  789. /// </summary>
  790. /// <param name="list">实体集合</param>
  791. /// <returns>删除成功</returns>
  792. public virtual bool DeleteEntities(IEnumerable<T> list)
  793. {
  794. DataContext.RemoveRange(list);
  795. return true;
  796. }
  797. /// <summary>
  798. /// 添加多个实体
  799. /// </summary>
  800. /// <param name="list">实体集合</param>
  801. /// <returns>添加成功</returns>
  802. public virtual IEnumerable<T> AddEntities(IList<T> list)
  803. {
  804. DataContext.AddRange(list);
  805. return list;
  806. }
  807. public override void Dispose(bool disposing)
  808. {
  809. //DataContext?.Dispose();
  810. //DataContext = null;
  811. }
  812. public T this[int id] => GetById(id);
  813. }
  814. public static class QueryableExt
  815. {
  816. /// <summary>
  817. /// 从二级缓存生成分页集合
  818. /// </summary>
  819. /// <typeparam name="T"></typeparam>
  820. /// <param name="query"></param>
  821. /// <param name="page">当前页</param>
  822. /// <param name="size">页大小</param>
  823. /// <returns></returns>
  824. public static PagedList<T> ToCachedPagedList<T>(this IOrderedQueryable<T> query, int page, int size) where T : LuceneIndexableBaseEntity
  825. {
  826. var totalCount = query.Count();
  827. if (page * size > totalCount)
  828. {
  829. page = (int)Math.Ceiling(totalCount / (size * 1.0));
  830. }
  831. if (page <= 0)
  832. {
  833. page = 1;
  834. }
  835. var list = query.Skip(size * (page - 1)).Take(size).Cacheable().ToList();
  836. return new PagedList<T>(list, page, size, totalCount);
  837. }
  838. /// <summary>
  839. /// 从二级缓存生成分页集合
  840. /// </summary>
  841. /// <typeparam name="T"></typeparam>
  842. /// <param name="query"></param>
  843. /// <param name="page">当前页</param>
  844. /// <param name="size">页大小</param>
  845. /// <returns></returns>
  846. public static async Task<PagedList<T>> ToCachedPagedListAsync<T>(this IOrderedQueryable<T> query, int page, int size) where T : LuceneIndexableBaseEntity
  847. {
  848. var totalCount = query.Count();
  849. if (page * size > totalCount)
  850. {
  851. page = (int)Math.Ceiling(totalCount / (size * 1.0));
  852. }
  853. if (page <= 0)
  854. {
  855. page = 1;
  856. }
  857. var list = await query.Skip(size * (page - 1)).Take(size).Cacheable().ToListAsync();
  858. return new PagedList<T>(list.ToList(), page, size, totalCount);
  859. }
  860. /// <summary>
  861. /// 生成分页集合
  862. /// </summary>
  863. /// <typeparam name="T"></typeparam>
  864. /// <typeparam name="TDto"></typeparam>
  865. /// <param name="query"></param>
  866. /// <param name="page">当前页</param>
  867. /// <param name="size">页大小</param>
  868. /// <param name="mapper"></param>
  869. /// <returns></returns>
  870. public static PagedList<TDto> ToPagedList<T, TDto>(this IOrderedQueryable<T> query, int page, int size, MapperConfiguration mapper)
  871. {
  872. var totalCount = query.Count();
  873. if (page * size > totalCount)
  874. {
  875. page = (int)Math.Ceiling(totalCount / (size * 1.0));
  876. }
  877. if (page <= 0)
  878. {
  879. page = 1;
  880. }
  881. var list = query.Skip(size * (page - 1)).Take(size).ProjectTo<TDto>(mapper).NotCacheable().ToList();
  882. return new PagedList<TDto>(list, page, size, totalCount);
  883. }
  884. /// <summary>
  885. /// 生成分页集合
  886. /// </summary>
  887. /// <typeparam name="T"></typeparam>
  888. /// <typeparam name="TDto"></typeparam>
  889. /// <param name="query"></param>
  890. /// <param name="page">当前页</param>
  891. /// <param name="size">页大小</param>
  892. /// <param name="mapper"></param>
  893. /// <returns></returns>
  894. public static async Task<PagedList<TDto>> ToPagedListAsync<T, TDto>(this IOrderedQueryable<T> query, int page, int size, MapperConfiguration mapper)
  895. {
  896. var totalCount = await query.CountAsync();
  897. if (page * size > totalCount)
  898. {
  899. page = (int)Math.Ceiling(totalCount / (size * 1.0));
  900. }
  901. if (page <= 0)
  902. {
  903. page = 1;
  904. }
  905. var list = await query.Skip(size * (page - 1)).Take(size).ProjectTo<TDto>(mapper).NotCacheable().ToListAsync();
  906. return new PagedList<TDto>(list, page, size, totalCount);
  907. }
  908. /// <summary>
  909. /// 从二级缓存生成分页集合
  910. /// </summary>
  911. /// <typeparam name="T"></typeparam>
  912. /// <typeparam name="TDto"></typeparam>
  913. /// <param name="query"></param>
  914. /// <param name="page">当前页</param>
  915. /// <param name="size">页大小</param>
  916. /// <param name="mapper"></param>
  917. /// <returns></returns>
  918. public static PagedList<TDto> ToCachedPagedList<T, TDto>(this IOrderedQueryable<T> query, int page, int size, MapperConfiguration mapper) where TDto : class where T : LuceneIndexableBaseEntity
  919. {
  920. var totalCount = query.Count();
  921. if (page * size > totalCount)
  922. {
  923. page = (int)Math.Ceiling(totalCount / (size * 1.0));
  924. }
  925. if (page <= 0)
  926. {
  927. page = 1;
  928. }
  929. var list = query.Skip(size * (page - 1)).Take(size).ProjectTo<TDto>(mapper).Cacheable().ToList();
  930. return new PagedList<TDto>(list, page, size, totalCount);
  931. }
  932. /// <summary>
  933. /// 从二级缓存生成分页集合
  934. /// </summary>
  935. /// <typeparam name="T"></typeparam>
  936. /// <typeparam name="TDto"></typeparam>
  937. /// <param name="query"></param>
  938. /// <param name="page">当前页</param>
  939. /// <param name="size">页大小</param>
  940. /// <param name="mapper"></param>
  941. /// <returns></returns>
  942. public static async Task<PagedList<TDto>> ToCachedPagedListAsync<T, TDto>(this IOrderedQueryable<T> query, int page, int size, MapperConfiguration mapper) where TDto : class where T : LuceneIndexableBaseEntity
  943. {
  944. var totalCount = query.Count();
  945. if (page * size > totalCount)
  946. {
  947. page = (int)Math.Ceiling(totalCount / (size * 1.0));
  948. }
  949. if (page <= 0)
  950. {
  951. page = 1;
  952. }
  953. var list = await query.Skip(size * (page - 1)).Take(size).ProjectTo<TDto>(mapper).Cacheable().ToListAsync();
  954. return new PagedList<TDto>(list.ToList(), page, size, totalCount);
  955. }
  956. }
  957. }