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