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);
    }
}

このメソッドに関する私の問題は、リポジトリが汎用であるため、 idフィールド、またはそれが何と呼ばれるかがpublic virtual TEntity Get(object objectId)わからないことです。私ができる最善のことは、idフィールドの最も一般的な名前であるフィールドTEntityがあるかどうかを確認することです。Idそれでは、私はどのように言うの_entitySet.Where("Id = " + objectId)ですか?メソッドはありますが、よくあるpublic virtual TEntity FindOne(Expression<Func<TEntity, bool>> where)ことですが、オブジェクトを取得したいだけの場合はid、ラムダ式全体を書きたくありません。

4

1 に答える 1

0

次の質問のように、エンティティを返す別のメソッドを作成する必要があります。ObjectSet<T>のエンティティキー名を取得するにはどうすればよいですか。、あなたは少しごまかして、以下のように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 に答える