我不知道我怎么能做一些与众不同的联盟。
当我使用带有IEqualityComparer的.Distinct时抛出异常:
LINQ to Entities无法识别方法'System.Linq.IQueryable'
我的代码是
var union = query.Union(query1).Union(query2);
union = union.Distinct(new EqualityComparerTransaction());
答案 0 :(得分:9)
LINQ to Entities不支持带Distinct
的{{1}}的重载。当你考虑它时,它确实不能,因为LINQ to Entities查询将被转换为SQL,并且你无法将接口引用转换为SQL。
因此,您必须:
IEqualityComparer
重载,或将两个列表放入对象空间并在LINQ to Objects中执行Distinct
,如下所示:
Distinct
当然,这里的风险是您可能会从DB服务器返回太多记录。您还可以使用这两种技术,以便在服务器上执行部分比较,在对象空间中执行另一部分。
答案 1 :(得分:0)
回答的问题,但我只想分享我的经验。
不确定,但我认为错误消息是说我认为这个论点不支持Distinct方法。
实际上我们只想要Linq to SQL,这是一个可查询的表达式,表示如果这些属性相同,则会获得其中一个。
但是当我们使用像EqualityComparerTransaction这样的类时,它无法正常转换为sql。
还有另一种方法 GetDistict< T>(字符串属性名称)但遗憾的是它不能像我们预期的那样工作。这个方法也适用于DB(我们的源代码)以及获取一些数据并进行不同的评估。
如果GetDistinct(string propertyName)扩展方法是做sql convertion操作它可能是。但是没有办法。
可悲的是,这样做的唯一方法就是为LINQ_TO_SQL编写自己独特的扩展名。我不认为这很容易!因此,服务器端的Enumarating数据现在看起来最简单。