我有以下(大大删节)通用存储库类:
public class Repository<TEntity> : IRepository<TEntity> where TEntity : class
{
private DbSet<TEntity> _entitySet;
private NewExternalsContext _dbContect;
public Repository(NewExternalsContext dbContext)
{
_dbContect = dbContext;
_entitySet = _dbContect.Set<TEntity>();
}
public virtual TEntity Get(object objectId)
{
// TODO Figure out how to use 'id' to build an Expression<Func<TEntity, bool>>.
throw new NotImplementedException();
}
public virtual TEntity FindOne(Expression<Func<TEntity, bool>> where)
{
return _entitySet.FirstOrDefault(where);
}
}
我对public virtual TEntity Get(object objectId)
方法的问题是因为存储库是通用的,我不知道TEntity
有任何id字段,或者它的名称。我能做的最好的事情是检查它是否有Id
字段,这是我最常用的id字段名称。然后,我如何例如说_entitySet.Where("Id = " + objectId)
?我有public virtual TEntity FindOne(Expression<Func<TEntity, bool>> where)
方法,但是当我想通过id
得到一个对象时,我很想写出一个完整的lambda表达式。
答案 0 :(得分:0)
您将需要创建另一个方法,在此问题中返回一个实体:How to get ObjectSet<T>'s entity key name?,您可以作弊并通过ID获取实体,如下所示:
public T GetById(int id)
{
var keyPropertyName =_objectSet.EntitySet.ElementType.KeyMembers[0].ToString();
T entity = _objectSet.Where("it." + keyPropertyName + "=" + id).First();
return entity;
}