0

我有以下(大大删节的)通用存储库类:

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 表达式。

4

1 回答 1

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;
    }
于 2013-03-10T12:35:51.690 回答