如何用LINQ查询检测InfoObject中User数据的重复问题
检测InfoObject中用户跨Type重复的LINQ查询
根据你的需求,我们需要找出同一Code分组下,单个用户对应多种Type的违规情况。以下是两种场景的LINQ实现:
1. 获取所有违规的详细信息
这个查询会返回所有违规的Code、用户名以及对应的多个Type:
// 假设你有InfoObject的集合:List<InfoObject> infoObjects var duplicateUserEntries = infoObjects // 展开每个InfoObject中已选中的用户(Value="1"),关联Code和Type .SelectMany(info => info.Users .Where(user => user.Value == "1") .Select(user => new { info.Code, info.Type, UserName = user.Name })) // 按【Code+用户名】分组,聚焦同一Code下的单个用户 .GroupBy(x => new { x.Code, x.UserName }) // 筛选出对应多个不同Type的分组 .Where(g => g.Select(x => x.Type).Distinct().Count() > 1) // 整理成易读的结果结构 .Select(g => new { Code = g.Key.Code, UserName = g.Key.UserName, AssociatedTypes = g.Select(x => x.Type).Distinct().ToList() }) .ToList();
2. 仅判断是否存在违规情况
如果只需要知道是否有违规,不需要详情,可以简化为:
bool hasDuplicateUsers = infoObjects .SelectMany(info => info.Users .Where(user => user.Value == "1") .Select(user => new { info.Code, info.Type, UserName = user.Name })) .GroupBy(x => new { x.Code, x.UserName }) .Any(g => g.Select(x => x.Type).Distinct().Count() > 1);
逻辑说明
- 扁平化数据:用
SelectMany把每个InfoObject中选中的用户(Value="1")拆分成独立条目,每个条目包含Code、Type和用户名。 - 分组聚合:按
Code和用户名分组,确保我们只关注同一Code下的同一个用户。 - 违规判断:检查每个分组内的
Type是否有多个不同值,若有则说明该用户在同一Code下对应了多种Type,属于违规。
以你提供的无效案例为例,这个查询会捕捉到Code=XYZ下的John同时关联Type=A和Type=B的情况。
内容的提问来源于stack exchange,提问作者Mark U
相关产品推荐
相关产品推荐

