2014-10-18 74 views
-1

我有一個作爲某種存儲庫的類,並授予對數據庫的訪問權限。我試圖定製它以允許使用表達式進行查詢。如何讀取表達式的內容?

所以,我希望能夠做到這一點:

IList<MyClass> myList = myRepository.GetBy(x => x.Name == "SomeName"); 
//and... 
IList<MyClass> myList2 = myRepository.GetBy(x => x.Name == "SomeName" && x.ID = 5); 

這是我需要對存儲庫功能:

​​

我怎樣才能做到這一點?

+4

http://msdn.microsoft.com/en-us/library/bb882521(v=vs.90).aspx – MarcinJuraszek 2014-10-18 01:26:09

+0

什麼阻止你做'blah.Where(expression.Compile())'? – DavidG 2014-10-18 02:17:11

+0

@DavidG這將是低效的。 'Compile'返回委託,所以在從數據庫獲取所有對象之後,預測將在服務器端應用。它會問爲什麼不使用'queryable。Where(expression);' – 2014-10-18 05:48:09

回答

-1

如果我正確理解你的問題,你可以繼承基本通用知識庫接口的知識庫接口。

public interface IRepositoryBase<TEntity> 
{ 
    IList<TEntity> GetBy(Expression<Func<TEntity, bool>> expression) 
} 

和基礎信息庫實現庫實現

public abstract class RepositoryBase<TEntity>: IRepositoryBase<TEntity> 
{ 
    public MyEntities EntitiesContext { get; set; } 

    public IList<TEntity> GetBy(Expression<Func<TEntity, bool>> expression) 
    { 
     return EntitiesContext.Set<TEntity>().Where(filter).ToList() 
    } 
} 
+0

如果他已經有查詢提供者,那麼他不需要做任何*。這個問題的關鍵在於他沒有針對相關數據源的查詢提供者。 – Servy 2014-10-29 15:50:18

1

你想要做的是什麼: IList <MyClass> myList2 = myRepository.GetBy (x => x.Name == "SomeName" && x.ID = 5); 確實,您可以代表x => x.Name == "SomeName" && x.ID = 5 with Expression <Func <T, bool >>

但您也可以只使用代表Func <T, bool>

無論哪個均取數據將總是從IEnumerable <T>所以你總是將具有Where方法(無論何時使用的命名空間System.Linq),它接受作爲參數委託Func <T, bool>的。如果對象IEnumerable <T>DbSet <T>,這將負責轉換SQL查詢中的代表Func <T, bool>。請記住,正在使用的Linq查詢僅在查詢數據被使用或與方法ToList()ToArray()(例如)一致時纔會執行。

例如:您從任何地方甚至從的EntityFramework的DbSet獲取數據 IEnumerable <MyClass> list = ...

var query = list.Where (x => x.Name == "SomeName" && x.ID = 5); 

查詢是shost查詢,它不包含任何數據,直到做到這一點

foreach (var x in list) is being consumed, so the query is executed 
{ 
   var c = x.Name; 
} 

或本

`var temp = query.ToList();` 

這個力量存儲在一個List <MyClass> 所有這一切,我想說的是,如果你使用EntityFramework的DbSet,會發生什麼是委託Func <T, bool>轉換成一個SQL查詢,以便數據管理器負責過濾數據(應該是)。 從這個只有你自己必須只需你的方法

public IList <T> GetBy (Func <T, bool> expression) 
{ 
    origen.Where (expression).ToList(); 
}