LINQ选择Distinct而忽略XML字段

TJB*_*TJB 7 c# xml linq linq-to-entities distinct

我有一个复杂的LINQ查询(使用LINQ 2 EF)可以返回重复的结果,因此我使用该.Distinct()方法来避免重复.这是骨架:

var subQuery1 = // one query...
var subQuery2 = // another query...
var result = subQuery1.Distinct().Union( subQuery2.Distinct() ).ToArray();
Run Code Online (Sandbox Code Playgroud)

每个子查询将一个公共用户表与另一个表连接起来并执行"where"查询,稍后将结果组合在一起.Union(...).这个工作正常,直到表被修改为包含XML列,这导致此异常:

不能将xml数据类型选为不同的,因为它不具有可比性

在这种情况下,我不关心XML列是否在结果中是等效的.实际上我只需要确保主键UserId在结果中是不同的.

有没有办法使用Distinct()但忽略XML列或更简单的方法来确保我UserId以有效的方式从结果中删除记录?理想情况下,这不会从数据库中检索重复记录,也不需要进行后处理来删除重复记录.

更新: 我发现如果我提前将查询序列化到数组,则不需要任何类型的比较器,因为Linq2Objects没有XML不同的选择问题.例如,我可以这样做:

var subQuery1 = // one query...
var subQuery2 = // another query...
var result = 
   subQuery1.Distinct().ToArray().Union( 
      subQuery2.Distinct().ToArray() )
   .ToArray();
Run Code Online (Sandbox Code Playgroud)

所以我真正想要的是一种避免序列化中间查询并直接执行Linq2Entities调用的方法,该调用不会获取具有重复UserIds的记录.感谢迄今为止的所有答案.

Ter*_*lis 1

此扩展方法应返回一个项目列表,其中仅包含每组重复项中的第一个项目...

public static IEnumerable<Tsource> RemoveDuplicates<Tkey, Tsource>(this IEnumerable<Tsource> source, Func<Tsource, Tkey> keySelector)
{
    var hashset = new HashSet<Tkey>();
    foreach (var item in source)
    {
        var key = keySelector(item);
        if (hashset.Add(key))
            yield return item;
    }
}
Run Code Online (Sandbox Code Playgroud)

它会用在这样的列表上list.RemoveDuplicates(x => x.UserID)。如果List中有两条记录具有相同的userID,则只返回第一条