2009-01-26 43 views
1

像這樣的事情會嚴重影響性能嗎?多個LinqToSQL查詢和性能

var myQuery = from c in Customers select c; 

var filter1 = from c in myQuery where c.ID > 2 select c; 

myQuery = filter1; 

var filter2 = from c in myQuery where c.Name.Contains("r") select c; 

myQuery = filter2; 

當我這樣做時,似乎只做最後的實際查詢,而不是每個「var ...」。到目前爲止,所有的過濾器似乎只是構造一個查詢,所以看起來好像沒什麼不同,並且在1個查詢中放置所有過濾器沒有太大的性能差異。我錯了,它實際上對數據庫運行多個查詢?

我想找出一個很好的方法來創建基於用戶的輸入查詢,以便他們可以過濾不同的標準。只要這樣做不會花費大量時間,我並不太擔心表現。

我也發現了有關Dynamic Linq庫的文章,但是使用它看起來很笨重,我沒有看到用這種方式做這件事的很多不同。

回答

3

我會看看使用擴展方法動態構建查詢。我認爲它會做你需要做的。而且,是的,在執行需要結果的操作之前,查詢纔會被實際評估,所以將它們組合起來並不一定會導致額外的數據庫訪問。

var query = db.Customers; 
if (selectID.HasValue) 
{ 
    query = query.Where(c => c.ID > selectID.Value); 
} 
if (!string.IsNullOrEmpty(nameFilter)) 
{ 
    query = query.Where(c => c.Name.Contains(nameFilter)); 
} 

foreach (var customer in query) // now the query is performed 
{ 
... 
} 
6

不,它不會執行任何查詢,直到您開始實際詢問結果。以這種方式構建查詢很好,並且是關於LINQ的好事之一。

它在LINQ to Objects中的工作方式(延遲執行 - 實際管道非常不同),只要你使用懶惰的查詢操作符(基本上所有返回的IEnumerable<T>IOrderedEnumerable<T>)。

+0

他能通過迭代filter1和filter 2得到結果嗎?我認爲它會失敗,你只能循環結果一次消息... – 2009-01-26 20:05:46

+0

我還沒有嘗試過,但我希望它能正常工作 - 過濾器是查詢,而不是結果查詢。 – 2009-01-26 20:13:06