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

标签 c# entity-framework repository distinct

我有标准的 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/

相关文章:

c# - 尝试将行添加到数据表时线程进入等待或 sleep 状态

json - 在 Angular 2 中从 Web API 获取数据

.net - 无法加载 Entity Framework 提供程序类型 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer'

java - Team 的集中式本地 Maven 存储库

c# - 在外部进程中调试 COM 对象

c# - 如何在通用 Windows 应用程序中垂直对齐 StackPanel?

entity-framework - Entity Framework 4.3代码中的错误优先-索引已存在

Git 克隆私有(private)仓库,权限被拒绝

git - 如何从git分支中删除文件

c# - 如何在多个线程之间传递值