Linq - 将用户声明与记录声明相匹配

Linq - Matching user claims with record claims

我一直在努力思考如何解决这个问题,我认为 Linq 可能是可行的方法,但不确定如何。

我有许多记录,每个记录都附有许多声明,例如:

我有一个用户有多项声明:

我需要匹配记录的所有声明,因此在上面的示例中,用户记录匹配 record1 和 record3

明确地说,根据评论,如果用户拥有所有声明,我想要所有记录

Linq 可以做到这一点吗?

这是您要使用 join 语句的地方。

var result = from r in records
         join c in user1.claims on r.claims.Contains(c)
         select r;

在英语中,这是说对于我们拥有的每条记录,我们都匹配至少有一个声明与用户的声明相匹配的记录,并且只返回这些记录。这还假设您已经实施了 EqualsGetHashCode 方法,以便您可以比较声明。

您正在尝试获取所有记录,其中所有记录的声明都在该其他用户的声明集合中。您可以编写一个或多或少类似于这些规范的 LINQ 查询:

var query = records.Where(record => 
    record.Claims.All(recordClaim => user.Claims.Contains(recordClaim));

请注意,如果 user.Claims 是任意大小的集合,并且您在 LINQ to objects 中执行此操作而不是使用数据库的查询提供程序,则应将这些声明放入 HashSet 首先(在查询之外),因为这将帮助它更好地扩展。