【问题标题】:asp.net - make generic method to find if entity exists in dbasp.net - 制作通用方法来查找数据库中是否存在实体
【发布时间】:2021-09-21 14:20:12
【问题描述】:

我在将部分代码重写为可用于其他方法的通用函数时遇到问题。

这是我要重写的代码示例:

if(!await _bikeDbContext.Order.AnyAsync(x => x.OrderId == orderId))
      {
        throw new BusinessNotFoundException("Order was not found");
      }

这是我想要的东西:

await _bikeDbContext.Order.IsAnyRule(x => x.OrderId == orderId));

我开始自己编写代码,但我不知道在函数体中放什么

public static void IsAnyRule<TEntity>(TEntity entity)
      where TEntity : class
    {
      
    }

【问题讨论】:

  • 如果你想要描述的用法,你需要一个 DbSet 上的扩展方法
  • 这应该会有所帮助:stackoverflow.com/questions/48860276/…
  • 您使用的方法已经是通用的DbSet&lt;T&gt;.Find 已经是通用的。 .Any(...) 已经是通用的。你为什么想要别的东西?您要解决什么实际问题?
  • 为什么要进行存在性检查而不是编写无论实体存在与否都有效的代码?例如.FirstOrAsync 将加载实体,如果它丢失则返回 null。

标签: c# asp.net generics


【解决方案1】:
 public bool IsExist<TEntity>(Expression<Func<TEntity, bool>> predicate = null) where TEntity : class
        {
            IQueryable<TEntity> data = _bikeDbContext.Set<TEntity>();
            return data.Any(predicate);
        }

然后用作

IsExist<Order>(x => x.OrderId == orderId);

【讨论】:

  • 最好使用.Any(predicate) 而不是.FirstOrDefault(predicate) != null,因为FirstOrDefault 会将实体加载到更改跟踪器中,这将改变代码的行为。
  • @huMptyduMpty 这个回答者基本上就是IQueryable&lt;T&gt;.Any()。这没有错。这是一个没有什么意义的问题。 IQueryable 和 DbSet 方法已经是通用的
猜你喜欢
  • 2011-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-10
相关资源
最近更新 更多