我能夠創建一個我認爲很奇怪的LINQ語句,並希望看看是否有其他人有過使用它的經驗。將查詢數據從LINQ傳遞給同一查詢中的方法
我就簡化爲這樣:
var x = db.Test
.Where(a => a.Field1 == Utils.CreateHash(Preferences.getValue(a.Field2)))
.FirstOrDefault();
現在,這如何轉換爲數據庫的代碼?不會LINQ需要對每一行進行雙重查詢,即對於行a:
1) Query a.Field2 2) Return value to run Utils.CreateHash(Preferences.getValue(a.Field2)) 3) Take that value from step 2 and compare it against a.Field1 4) Repeat 1-3 until I've gone through all the rows or returned a matching row
這不會是非常低效嗎?還是LINQ智能足以以更好的方式運行它?請注意,我沒有真正運行此代碼,因此另一種可能性是運行時錯誤。爲什麼LINQ不夠智能以檢測到衝突,而不讓我編譯它?
我不認爲你的查詢將工作是看到你要'utils的呼叫。你試圖在數據庫上執行的lambda中的CreateHash' – BrokenGlass 2012-03-30 18:52:21
@BrokenGlass我實際上並沒有運行它,但爲什麼它會編譯? Linq是否不夠聰明知道該功能不在數據庫上? – onit 2012-03-30 18:54:58
不,Linq IQuerable提供程序在運行時會失敗,lambda語法是有效的,並且與Linq到對象一起使用,而不是在您的提供程序上(它在運行時將查詢轉換爲數據庫查詢) – BrokenGlass 2012-03-30 18:55:58