2012-05-07 48 views
0

使用實體框架4.3在我的數據訪問類的我有這樣的實體框架生成的SQL查詢沒有where子句

public List<Company> Query(Func<Company, bool> expression) 
    { 
     return MyDbContext.Instance().Company.Where(expression).ToList(); 
    } 

我用它從bussines層類作爲MyDAL.Query泛型函數(一=> a.Name.Contains(textToSearch))。

儘管Entity Framework返回正確的結果,但我不知道爲什麼它會生成一個Sql查詢語句,並在Where子句中使用「Where name like'%'+ textToSearch +'%'」,它會生成一個sql查詢沒有where子句的句子查詢所有的表格行。顯然這非常不利。

通過其他方式,如果在我的數據訪問clases我寫這樣的方法:

public List<Company> GetLikeName(string textToSearch) 
    { 
     return MyDbContext.Instance().Company.Where(a => a.Contains(textToSearch)).ToList(); 
    } 

它生成正確地在那裏同樣子句的SQL語句。

爲什麼如果我使用我的通用查詢從數據庫檢索結果指定從我的商務類查詢表達式,它會生成一個沒有where子句的Sql句子?

感謝

回答

4

您需要通過表達參數作爲Expression<>

public List<Company> Query(Expression<Func<Company, bool>> expression) 

如果你只是傳遞一個Func<>,然後IEnumerable.Where被調用,而不是IQueryable.Where,並在代碼運行,而不是在SQL。

+0

完美!有用。感謝您的幫助 –

+0

不客氣:) –