2010-02-19 146 views
9

我不知道我可以如何與一個獨特的幾個聯合。Linq to entities:Unions + Distinct

當我使用.Distinct用的IEqualityComparer一個例外拋出:

LINQ到實體無法識別方法 'System.Linq.IQueryable'

我的代碼是

var union = query.Union(query1).Union(query2); 
union = union.Distinct(new EqualityComparerTransaction()); 

回答

10

LINQ to Entities不支持Distinct的過載,其中需要IEqualityComparer。當你考慮它時,它確實不能,因爲LINQ to Entities查詢將轉換爲SQL,並且不能將接口引用轉換爲SQL。

因此,你必須:

  1. 使用過載的Distinct不採取任何比較,或
  2. 把兩份名單爲目標的空間和做Distinct在LINQ到對象,像這樣:

    var union = query.Union(query1).Union(query2); 
    union = union.AsEnumerable().Distinct(new EqualityComparerTransaction()); 
    

當然,這裏的風險是,你可能會帶來太多的[R從數據庫服務器回來。您也可以使用這兩種技術來完成服務器上的一部分比較以及對象空間中的另一部分比較。

+0

感謝您的回答! 我想我會使用這兩種技術。 就像我使用服務器端分頁一樣,這並不簡單... – lu2vik 2010-02-22 10:28:09

0

這個問題的答案,但我只是想分享我的經驗。

不知道,但我認爲錯誤消息與說不同的方法不支持這個參數,我認爲。

事實上,我們只是希望Linq to SQL,一個可查詢的表達式,表示這個屬性是否可以獲得其中一個。

但是當我們使用EqualityComparerTransaction這樣的類時,它不能正常轉換爲sql。

還有另外一種方法GetDistict < T>(string propertyName)但遺憾的是,它並不像我們預期的那樣工作。這個方法也到DB(我們還有什麼來源),並獲得一些數據和獨特的評估。

如果GetDistinct(字符串propertyName)擴展方法是做sql轉換操作它可能是。但是沒有辦法。

不幸的是,這樣做的單一方式是編寫您自己對LINQ_TO_SQL的不同擴展。我不認爲這會很容易!因此,在服務器端注入數據似乎是最簡單的。