Linq to entities:Unions + Distinct

时间:2010-02-19 14:29:14

标签: c# linq-to-entities union distinct

我不知道我怎么能做一些与众不同的联盟。

当我使用带有IEqualityComparer的.Distinct时抛出异常:

  

LINQ to Entities无法识别方法'System.Linq.IQueryable'

我的代码是

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

2 个答案:

答案 0 :(得分:9)

LINQ to Entities不支持带Distinct的{​​{1}}的重载。当你考虑它时,它确实不能,因为LINQ to Entities查询将被转换为SQL,并且你无法将接口引用转换为SQL。

因此,您必须:

  1. 使用不需要比较的IEqualityComparer重载,或
  2. 将两个列表放入对象空间并在LINQ to Objects中执行Distinct,如下所示:

    Distinct
  3. 当然,这里的风险是您可能会从DB服务器返回太多记录。您还可以使用这两种技术,以便在服务器上执行部分比较,在对象空间中执行另一部分。

答案 1 :(得分:0)

回答的问题,但我只想分享我的经验。

不确定,但我认为错误消息是说我认为这个论点不支持Distinct方法。

实际上我们只想要Linq to SQL,这是一个可查询的表达式,表示如果这些属性相同,则会获得其中一个。

但是当我们使用像EqualityComparerTransaction这样的类时,它无法正常转换为sql。

还有另一种方法 GetDistict< T>(字符串属性名称)但遗憾的是它不能像我们预期的那样工作。这个方法也适用于DB(我们的源代码)以及获取一些数据并进行不同的评估。

如果GetDistinct(string propertyName)扩展方法是做sql convertion操作它可能是。但是没有办法。

可悲的是,这样做的唯一方法就是为LINQ_TO_SQL编写自己独特的扩展名。我不认为这很容易!因此,服务器端的Enumarating数据现在看起来最简单。