2014-04-06 42 views
2

我是LINQ的新手,並且有一個基本查詢。Linq鏈接SELECT和DISTINCT運算符

說我有客戶大名單的對象

List<Customer> c = null; 
c = //Fetch from DB - resulting into 1000+ non-unique Customers; 

如果我轉換列表轉換成說,另一個類的列表 - 由於缺乏一個更好的名字 - CustomerEntity,然後挑選出不同的人作爲如下:

var ce = c.Select(cust => new CustomerEntity() 
        { 
         CustomerID = cust.CustID, 
         CustomerName = cust.CustName 
        }).Distinct(new CustomerEntityComparer()).ToList(); 

CustomerEntityComparer只是一個根據CustomerID比較2個CustomerEntity對象的類。 我的查詢是: 如果選擇和區別被鏈接,會導致在列表上多次迭代?

感謝

維卡斯

+0

什麼問題?你做了什麼來調查它? – erikkallen

+0

簡單的答案是:不。但是你可以在數據庫端做這些轉換('SELECT DISTINCT')... –

+0

如果你想了解更多關於LINQ(對象)的內部工作方式,我推薦http://msmvps.com/blogs/jon_skeet/ archive/2011/02/23/reimplementing-linq-to-objects-part-45-conclusion-and-list-of-posts.aspx其中Jon Skeet重新創建了LINQ並解釋了所有涉及的原理(例如,迭代)。簡單的答案是,它只會迭代原始列表一次。 – Chris

回答

1

爲了給出一個更詳細的回答:
你可以注意到,選擇()返回一個IEnumerable,也是如此鮮明的()。這是因爲你基本上正在創建一個查詢。在調用ToList()方法之前,不會進行選擇或獨立過濾。當ToList()方法被執行時,整個查詢被評估。這就是所謂的延期執行。

這樣做的好處是,你可以創建這樣的查詢:

var ceQuery = c.Select(cust => new CustomerEntity() 
{ 
    CustomerID = cust.CustID, 
    CustomerName = cust.CustName 
}).Distinct(new CustomerEntityComparer()); 

,然後在每次「C」變了,你可以重新使用相同的ceQuery以獲取最新restul時間:

var ce = ceQuery.ToList(); 
+0

很酷。謝謝。我知道,在LINQ To SQL的情況下,查詢被轉換爲表達式樹,然後當請求exec時 - 該樹用於生成SQL。我也意識到L2Object的延遲執行方面。但是,對於L2Object而言,沒有把握確信2個鏈接的調用實際上只會在集合上進行一次迭代,即使是延遲執行。我懷疑是否放棄了SELECT和DISTINCT操作。因此想要仔細檢查。 – Vikas