2016-11-02 263 views
0

SELECT DISTINCT的問題asked here的擴展,我試圖做同樣的功能,即與LINQ到實體

IEnumerable<Customer> filteredList = originalList 
    .GroupBy(customer => customer.CustomerId) 
    .Select(group => group.First()); 

這在評論,有人暗示,如果是的LINQ這是不行的實體,當然不是爲我工作,我得到一個空結果集。

不適合我!即使我嘗試了'FirstOrDefault',但它不起作用。 - JatSing Sep 25 11年在13:55

@JatSing:您必須使用Linq到實體。 - 喬希Mouch年02月14 '12 14:45

所以,如果上面沒有對LINQ工作實體,我將如何去分組由兩列設置的EntityType消息的IEnumerable,然後得到每組的第一行?

+0

「空結果集」,你的意思是filteredList是一個沒有值的IEnumerable,或者你說'filteredList'實際上是'null'嗎?如果是前者,你確定'originalList'有任何內容嗎? – UtopiaLtd

+0

IEnumerable沒有值,originalList具有期望的內容 – ItinerantEngineer

+1

可能不理想,但如果在'.GroupBy(...)'之前調用'.ToList()'會怎麼樣? – UtopiaLtd

回答

0

如果您在通過實體框架等方式評估LINQ表達式時遇到問題,您可以致電.ToList()強制將查詢實現到內存中以供進一步處理。如果來自數據庫或其他來源的結果的獲取非常昂貴並且可以首先進一步縮小,則這並不理想。

IEnumerable<Customer> filteredList = originalList 
    .ToList() 
    .GroupBy(customer => customer.CustomerId) 
    .Select(group => group.First()); 

.ToList()調用使得實體框架加載與數據庫的完整originalList(我以爲是某種形式的IQueryable<T>),允許.GroupBy(...)在內存中進行評估關閉的originalList全部結果的,而不是部分EF構建的SQL查詢。

+0

「.OrderOrDefault()」的人來說,上述評論中提到的是一種更好的方法,如果你先調用'.ToList()',那麼'.First()'是合適的,因爲在這一點上你不會有任何小於1的有效分組。 – UtopiaLtd

+0

一旦你要使用LINQ to Objects進行分組,最好使用'AsEnumerable'來切換上下文而不是'ToList'。 –