0

我有普通班。我需要通过 ID 创建方法获取 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();
        }
    }
4

2 回答 2

3

如果您使用DbContextthen 方法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);
}
于 2012-11-22T20:39:19.037 回答
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);
    }

    ...

}
于 2012-11-22T20:40:36.983 回答