2013-04-29 62 views
2

我已經設置了與代碼優先方法的實體框架項目: Link to code-first approach。凡Lambda表達式加載整個表

我已經加入通過插入函數來訪問儲存庫的方法:

的接口,用於存儲庫:

IQueryable<T> GetMany(Func<T, bool> where); 

的EntityRepositoryBase方法:

public virtual IQueryable<T> GetMany(Func<T, bool> where) 
{ 
    return dbset.Where(where).AsQueryable(); 
} 
的我如何訪問它

實施例:

genericRepositoryName.GetStuffInHere(x => x.Name== "Billy"); 

然而,當該執行它加載整個表和向下過濾數據。如你所想,這需要很長時間。我有一個使用.Find()的ByID方法,它正確地執行查詢並以毫秒爲單位獲取記錄。我完全不知道爲什麼會發生這種情況 - 或者我做錯了什麼。是否有更好的方法來抓取所有包含字段「Hello」的字段的記錄。當前進程需要5-10秒才能獲得記錄。

回答

6

在猜測......

使用LINQ,把它變成一個SQL查詢它必須有一個表達式樹,它就可以轉化爲SQL。我認爲最多

嘗試只dbset.Where(x -> x.Name=="Billy);

您Func鍵螺絲或柯克在評論中指出的,改變一個表達式樹:

public virtual IQueryable<T> GetMany(Expression<Func<T, bool>> where) 
+3

對,或者將'Func '改成'Expression >' – 2013-04-29 20:57:55

+1

你也可以在你這樣做的時候擺脫'AsQueryable'。它開始沒有應該有一個暗示,你正在使用'Where'而不是IQueryable版本的IEnumerable超載。 – Servy 2013-04-29 21:09:45

+0

@Kirk Woll非常好!這工作!非常感謝。 – 2013-04-30 12:27:13

1

如果我不得不猜測,dbset不是IQueryable<T>DbSet。這可能是IEnumerable<T>的某種方式,這會導致整個表在C#而不是SQL中被提取和過濾。

我會確保您不會將dbset更改爲任何地方的枚舉,只需撥打ToList()或將其通過foreach循環即可。

+0

好了,謝謝!當我明天回去工作時,我會通讀我的代碼! – 2013-04-29 20:52:00

+0

爲什麼選擇投票? – wilsjd 2013-04-30 00:06:24

+0

不知道 - 不是我通過檢查..找到一個'code'ToList()'代碼'但它仍然無法工作。今天去研究其他答案,看看它是否有幫助!不幸的是,我不能投票給他:(。 – 2013-04-30 11:51:55