【问题标题】:FindBy Id method in EntityFramework实体框架中的 FindById 方法
【发布时间】:2013-02-13 23:07:58
【问题描述】:

当我们有这个 GenericRepository 类时,可以在实体框架中实现 FindBy 方法:

public class Repository<T> : IRepository<T> where T : class, IAggregateRoot
    {

        private readonly DbSet<T> _entitySet;
public IQueryable<T> FindBy(Expression<Func<T, bool>> predicate)
        {
            //IQueryable<T> query=_entitySet.
        }
}

在这种情况下我该如何实现 FindBy !??

【问题讨论】:

  • 暗示加入一行代码! return _entitySet.Where(predicate);

标签: asp.net-mvc-3 entity-framework repository-pattern


【解决方案1】:

My Repository 有以下方法通过给定表达式返回单个实体。

public T FindSingle(Expression<Func<T, bool>> predicate) {
  return _entitySet.FirstOrDefault(predicate);
}

现在调用者可以使用任何表达式来获取单个实体,例如

var entity = _repository.FindSingle(entity=> entity.Id == 23);

var entity = _repository.FindSingle(entity=> entity.Name == "Hello World");

如果您的接口 IAggregateRoot 定义了一个属性 Id,您还可以向您的通用接口添加一个显式方法,以通过其 Id 获取单个实体。

public interface IAggregateRoot {
  int Id {get;}
}

public class GenericRepository {
  public T FindSingleById(int id) {
    return _entitySet.FirstOrDefault(entity=>entity.Id == id);
  }
}

【讨论】:

    【解决方案2】:

    这应该可以工作

    public class Repository<T> : IRepository<T> where T : class, IAggregateRoot
        {
    
            private readonly DbSet<T> _entitySet;
            public IQueryable<T> FindBy(Expression<Func<T, bool>> predicate)
            {
                return _entitySet.Where(predicate).
            }
    }
    

    【讨论】:

    • 是的,但是还有一个问题是如果想返回 T 而不是 IQueryable ,我该怎么办??
    • @EricNielsen 您想返回单个实例吗?然后在Where 之后使用FirstOrDefault()SingleOrDefault()
    • 这是一个 FindById 方法,我想按 Id 返回一条记录,很明显返回一个 T (ViewModel) 而不是 IQueryable
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    • 2020-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多