gpt4 book ai didi

c# - 在 Repository Pattern 中,我应该在哪里实现 Distinct 方法?

转载 作者:行者123 更新时间:2023-11-30 16:59:49 25 4
gpt4 key购买 nike

我有标准的 Repository 接口(interface)设置:

public interface IRepository<T, TKey> : IDisposable where T : class
{
T Get(TKey id);
IEnumerable<T> Get();
IEnumerable<T> Find(Expression<Func<T, bool>> whereClause);
T Add(T entity);
void Delete(T entity);
bool Save();
int Update(T entity);
}

它有一个实现:

public class EfRepository<T, TKey> : IRepository<T, TKey> where T : class
{
protected DbContext _context;

public EfRepository(DbContext context) { ...}

public virtual T Get(TKey id) {...}
public virtual IEnumerable<T> Get() { ...}

public virtual IEnumerable<T> Find(Expression<Func<T, bool>> whereClause) { ...}
public T Add(T entity) { ...}
public void Delete(T entity) { ...}
public bool Save() { ...}
public int Update(T entity) { ...}
}

我在所有这些之上有一个服务层:

public class VehicleService: IVehicleService
{
private readonly IRepository<Vehicle, int> _repository;

public VehicleService(IRepository<Vehicle, int> repository)
{
_repository = repository;
}

public IEnumerable<int> GetModelYears()
{
// ?? help?
}
}

我的问题是,在哪里实现 Distinct 方法? LINQ 查询如下所示:

context.Set<Vehicle>().Select(x => x.ModelYear).Distinct();

我还没有想出如何在存储库级别对 Distinct 方法进行通用编码,而且我认为这不是放置它的正确位置。

我们选择不在我们的存储库中返回 IQueryable。但我也没有向服务层公开任何实际的 DbSet 对象。

也许更好的问题是,这是一种正确的做事方式吗?有没有更好的办法?

最佳答案

如果这只是用于一种对象,而不是存储库中的所有用途,您可以创建一个新的存储库,包含该查询,但构建在 IRepository 上。

public interface IVehicleRepository : IRepository<Vehicle>{
IEnumerable<int> GetDistinctVehicle();
}

public VehicleRepository : EfRepository<Vehicle>, IVehicleRepository{

public VehicleRepository(DbContext context) : base(context)
{
}


public IEnumerable<int> GetDistinctVehicle(){
Context.Set<Vehicle>().Select(x=> x.ModelYear).Distinct();
}

}

这样,您仍然可以使用所有 IRepositorystuff,但也可以使用您的额外方法。只需在您选择的注入(inject)器中将 IVehicleRepository 绑定(bind)到 VehicleRepository,然后像使用 IRepositories 一样将其注入(inject)构造函数。

关于c# - 在 Repository Pattern 中,我应该在哪里实现 Distinct 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23227021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com