2010-02-19 106 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的不同扩展。我不认为这会很容易!因此,在服务器端注入数据似乎是最简单的。