0

我有以下的(大大删节)通用仓库等级:如何用字符串where子句查询DbSet?

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

+1

的DbSet类有一个[查找方法](http://msdn.microsoft.com/en-us/library/gg696418(v = vs.103).aspx)它可以做你想做的。它根据主键找到实体。 – nemesv 2013-03-10 12:24:02

回答

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; 
    } 
+0

谢谢,但其他阅读说,将DdSet 转换为ObjectSet 是不可能的,而我正在使用DbSets。否则,这看起来很酷。 – ProfK 2013-03-12 20:27:19