Entity framework 如何使用字符串查询数据库集';where子句';?

Entity framework 如何使用字符串查询数据库集';where子句';?,entity-framework,entity-framework-5,repository-pattern,repository,Entity Framework,Entity Framework 5,Repository Pattern,Repository,我有以下(大大简化的)通用存储库类: public class Repository<TEntity> : IRepository<TEntity> where TEntity : class { private DbSet<TEntity> _entitySet; private NewExternalsContext _dbContect; public Repository(NewExternalsContext dbConte

我有以下(大大简化的)通用存储库类:

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);
    }
}
公共类存储库:i存储,其中tenty:class
{
私有数据库集_entitySet;
私有NewExternalsContext_dbContect;
公共存储库(NewExternalsContext dbContext)
{
_dbContect=dbContext;
_entitySet=_dbContect.Set();
}
公共虚拟实体获取(对象objectId)
{
//TODO了解如何使用“id”构建表达式。
抛出新的NotImplementedException();
}
公共虚拟TEntity FindOne(表达式where)
{
返回_entitySet.FirstOrDefault(其中);
}
}

我对
public virtual TEntity Get(object objectId)
方法的问题是,因为存储库是泛型的,所以我不知道
TEntity
有任何id字段,或者它的名称。我所能做的就是检查它是否有
Id
字段,这是我最常用的Id字段名称。那么,例如如何说
\u entitySet.Where(“Id=”+objectId)
?我有
public virtual TEntity FindOne(Expression where)
方法,但当我只想通过
id
获取一个对象时,我不想写出一个完整的lambda表达式。

您将需要创建另一个方法,该方法返回一个实体,如本问题所述:,您可以进行一些欺骗,并按id获取实体,如下所示:

    public T GetById(int id)
    {
        var keyPropertyName =_objectSet.EntitySet.ElementType.KeyMembers[0].ToString();          
        T entity = _objectSet.Where("it." + keyPropertyName + "=" + id).First();
        return entity;
    }

DbSet类有一个函数,它实现您想要的功能。它根据主键查找实体。谢谢,但其他阅读材料说,将DdSet转换为ObjectSet是不可能的,我使用的是DBSET。否则这看起来很酷。