我有普通班。 我需要通过ID创建方法get seingleOrDefault吗?
怎么做?
public T GetByID(int id)
{
_entities.Set<T>().Single(x => x.);
}
普通班:
public abstract class GenericRepository<C, T> : IGenericRepository<T>
where T : class
where C : DbContext, new()
{
private C _entities = new C();
public C Context
{
get { return _entities; }
set { _entities = value; }
}
public virtual IQueryable<T> GetAll()
{
IQueryable<T> query = _entities.Set<T>();
return query;
}
public IQueryable<T> FindBy(System.Linq.Expressions.Expression<Func<T, bool>> predicate)
{
IQueryable<T> query = _entities.Set<T>().Where(predicate);
return query;
}
public virtual void Add(T entity)
{
_entities.Set<T>().Add(entity);
}
public virtual void Delete(T entity)
{
_entities.Set<T>().Remove(entity);
}
public virtual void Edit(T entity)
{
_entities.Entry(entity).State = System.Data.EntityState.Modified;
}
public virtual void Save()
{
_entities.SaveChanges();
}
}
答案 0 :(得分:4)
如果您使用DbContext
,则方法Set<T>()
会返回DbSet<T>
而不是ObjectSet<T>
。 DbSet<T>
方法DbSet<T>.Find(params object[] keyValues)
完全符合您的目标:
此方法使用主键值尝试查找由其跟踪的实体 上下文。如果实体不在上下文中,则查询将是 根据数据源中的数据执行和评估,并为null 如果在上下文或数据中找不到实体,则返回 源。
用法:
public T GetByID(int id)
{
return _entities.Set<T>().Find(id);
}
答案 1 :(得分:0)
如果您想以通用方式执行此操作,则需要在T
上添加通用约束。
像
这样的东西public interface IEntity
{
int Id { get; set; }
}
public abstract class GenericRepository<C, T> : IGenericRepository<T>
where T : class, IEntity
where C : DbContext, new()
{
public T GetByID(int id)
{
_entities.Set<T>().SingleOrDefault(x => x.Id == id);
}
...
}