我有一个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
未找到
答案 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();
}
我认为这更好。 您的意见是什么?