2010-05-01 94 views
0

我試圖創建一個基本知識庫,用於實體框架4.0並遇到一些麻煩。在下面的代碼中,爲什麼不可能在一行中做到這一點?實體框架基礎知識庫

public IEnumerable<T> GetAll<T>(Expression<Func<T, bool>> filter) 
{ 
    IEnumerable<T> allCustomers = this.GetAll<T>(); 
    IEnumerable<T> result = allCustomers.Where(filter.Compile()); 

    return result; 
} 

這會不會導致2條SQL語句:一個沒有檢索所有行的WHERE子句,以及一個用WHERE子句只檢索匹配謂詞的行?

這怎麼能用一個SQL語句完成?如果我嘗試將filter.Compile()傳遞給Func < Customer,則bool >。

回答

3

試試這個:

this.GetAll<T>().Where(filter); 

如果要添加其他條件和(使用SQL)執行它們在數據庫方面,GETALL()應該返回IQueryableIQueryable版本在哪裏需要Expression,所以不需要撥打Compile()。 EF將表達並將其轉換爲SQL。

使用IEnumerable版本的Where在應用過濾器之前執行查詢並檢索表中的所有行。

+0

是的,工作!非常感謝!返回(this.GetAll ()as IQueryable ).Where(filter); – Andy 2010-05-03 13:24:18

+0

@Andy:這太棒了,但仍然'GetAll ()'應該返回'IQueryable '並且不應該需要投射。如果'GetAll ()'返回'IEnumerable ',則從表中選擇所有行並在應用程序端進行篩選。 – LukLed 2010-05-03 17:57:15