如何在Set<>中使用用户实体框架中的方法

时间:2016-02-06 07:24:55

标签: c# asp.net-mvc entity-framework linq ef-code-first

我有一个UnitOfWork界面,如下所示:

public interface IUnitOfWork
{     
   //some other methods
    IDbSet<TEntity> Set<TEntity>() where TEntity : class;
}

并像这样实现:

public class StoreContext : DbContext, IUnitOfWork
{
    public new IDbSet<TEntity> Set<TEntity>() where TEntity : class
    {
            return base.Set<TEntity>();
    }
}

我使用Set方法我服务层如下:

public class BrandService : IBrandService
{
    private readonly IUnitOfWork _uow;
    private readonly IDbSet<Brand> _brands;

    public BrandService(IUnitOfWork uow)
    {
            _uow = uow;
            _brands = _uow.Set<Brand>();
    }
}

我希望在设置方法之后使用服务层中的位置:

_brands = _uow.Set<Brand>().Where(row=>row.IsActive == true);

但它返回错误:

  

无法将类型'System.Linq.IQueryable'隐式转换为'System.Data.Entity.IDbSet'

我该怎么做?

我在谷歌搜索但无法找到类似的问题。

我使用了这段代码:

 _uow = uow;
 _brands = _uow.Set<Brand>();

 var data = _uow.Set<Brand>().Where(e => e.IsDeleted == false);
 _brands = (IDbSet<Brand>)data.ToList();

但它返回buildPlan.Cs未找到

2 个答案:

答案 0 :(得分:2)

您无法将IQueryable分配给IDbSet。将您的声明更改为

private IQueryable<Brand> _brands;

答案 1 :(得分:0)

romanoza tahnks为您的答案。 如果我在Service Constructor中过滤IsActive等于True的所有行的数据,我就无法向用户显示IsActive =false所有的行,并且要做到这一点我喜欢一个extiontion方法像这样:

 public static IQueryable<TEntity> ACtive<TEntity>(this IDbSet<TEntity> set) where TEntity : BaseEntity
    {
        return set.Where(row=>row.IsActive==true);
    }

在我需要的任何地方,我只需拨打Active方法就像这样:

   public async Task<Brand> GetAsync(Guid brandId)
    {
        return await _brands.Active().Where(row => row.Id == brandId).FirstOrDefaultAsync();
    }
 public async Task<IEnumerable<Brand>> GetAllAsync()
    {
        return await _brands.Active().ToListAsync();
    }

我认为这更好。 您的意见是什么?