2015-04-19 25 views
1

我寫了一個自定義比較器來對字符串和數字進行排序。這一切工作正常。LINQ查詢中的自定義比較器對字符串/數字進行排序

但是,我重寫我的整個BLL在可能的情況下使用LINQ,因爲我喜歡它的語法。現在我絆倒在使用我的自定義比較器。由於LINQ語法(基於查詢)不允許使用自定義比較器,現在我正在使用基於LINQ的方法。

但爲了使它工作,我需要做一箇中間ToList(),它再次正常工作,但看起來有點奇怪嗎?

 var areas = cc.Areas.Where(a => a.ProjectId == ProjectId).ToList() 
          .OrderBy(a => a.UnitNumber, new Common.Comparers.StringNumericComparer()); 

現在我不能確定這是否與SQL查詢做第一個被執行,然後在我的C#代碼方面排序的結果,但是這超出了我的知識。 ToList()是否強制要在數據庫上執行linq查詢的第一部分?

回答

3

是的,你的理解是正確的。直到.ToList()它是一個IQueryable。在ToList()上,觸發數據庫查詢並將結果提取到內存中,然後在List上進行排序。

您的比較器在此之前無法執行,因爲它不會轉換爲SQL查詢。

+0

謝謝!是否有任何性能問題相關?我沒有看到任何其他的選擇來實現這一點。我可以重寫這個查詢基於語法嗎? – Martin

+0

@Martin:肯定有性能問題。它將整個列表帶到ToList上的內存中,並在IQueryable中作爲查詢在數據庫中執行,並僅帶回過濾結果。爲什麼你需要創建這樣的比較器? –

+0

但是沒有其他辦法可以實現這個目標?另一方面,真正基於第一個過濾器的行數不會超過10行。 – Martin

3

是的,.ToList()強制加載您的Areas,並在內存中進行排序。

相關問題