ASP.NET 如何编写通用泛型方法判断数据库中对应实体是否存在
实现方案
你现有方法的定义存在以下需要调整的点:
- 你需要实现的是
IQueryable<TEntity>的扩展方法,而非接收实体实例的普通方法,才能挂载到DbSet<T>(也就是你代码里的_bikeDbContext.Order)上调用 - 原方法是同步返回void,你需要的是异步方法,需返回
Task并支持await调用 - 缺少筛选条件的表达式参数,无法传入你写的
x => x.OrderId == orderId逻辑
完整实现代码
首先引入依赖的命名空间:
using Microsoft.EntityFrameworkCore; using System.Linq.Expressions; using System.Threading.Tasks;
扩展方法完整实现:
// 扩展方法必须放在静态类中 public static class QueryableExtensions { public static async Task IsAnyRuleAsync<TEntity>( this IQueryable<TEntity> query, Expression<Func<TEntity, bool>> predicate, string errorMessage = "资源未找到") where TEntity : class { if (!await query.AnyAsync(predicate)) { throw new BusinessNotFoundException(errorMessage); } } }
调用方式
和你期望的形式完全匹配:
// 可自定义错误消息,也可以不传参数使用默认值 await _bikeDbContext.Order.IsAnyRuleAsync(x => x.OrderId == orderId, "Order was not found");
可选调整
如果不需要遵循.NET异步方法的Async后缀命名规范,直接修改方法名为IsAnyRule即可,调用时就和你示例的写法完全一致。
内容的提问来源于stack exchange,提问作者jakubbebacz
相关产品推荐
相关产品推荐

