1
0

BaseRepository.cs 46 KB

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