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调用的方法,该调用不会获取具有重复UserId
s的记录.感谢迄今为止的所有答案.
此扩展方法应返回一个项目列表,其中仅包含每组重复项中的第一个项目...
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,则只返回第一条