Linq - 将用户声明与记录声明相匹配
Linq - Matching user claims with record claims
我一直在努力思考如何解决这个问题,我认为 Linq 可能是可行的方法,但不确定如何。
我有许多记录,每个记录都附有许多声明,例如:
- 记录1
- 索赔 1
- 索赔2
- 记录2
- 索赔 1
- claim4
- 记录3
- claim3
- 记录4
- claim4
我有一个用户有多项声明:
- 用户1
- 索赔 1
- 索赔2
- claim3
我需要匹配记录的所有声明,因此在上面的示例中,用户记录匹配 record1 和 record3
明确地说,根据评论,如果用户拥有所有声明,我想要所有记录
Linq 可以做到这一点吗?
这是您要使用 join 语句的地方。
var result = from r in records
join c in user1.claims on r.claims.Contains(c)
select r;
在英语中,这是说对于我们拥有的每条记录,我们都匹配至少有一个声明与用户的声明相匹配的记录,并且只返回这些记录。这还假设您已经实施了 Equals
和 GetHashCode
方法,以便您可以比较声明。
您正在尝试获取所有记录,其中所有记录的声明都在该其他用户的声明集合中。您可以编写一个或多或少类似于这些规范的 LINQ 查询:
var query = records.Where(record =>
record.Claims.All(recordClaim => user.Claims.Contains(recordClaim));
请注意,如果 user.Claims
是任意大小的集合,并且您在 LINQ to objects 中执行此操作而不是使用数据库的查询提供程序,则应将这些声明放入 HashSet
首先(在查询之外),因为这将帮助它更好地扩展。
我一直在努力思考如何解决这个问题,我认为 Linq 可能是可行的方法,但不确定如何。
我有许多记录,每个记录都附有许多声明,例如:
- 记录1
- 索赔 1
- 索赔2
- 记录2
- 索赔 1
- claim4
- 记录3
- claim3
- 记录4
- claim4
我有一个用户有多项声明:
- 用户1
- 索赔 1
- 索赔2
- claim3
我需要匹配记录的所有声明,因此在上面的示例中,用户记录匹配 record1 和 record3
明确地说,根据评论,如果用户拥有所有声明,我想要所有记录
Linq 可以做到这一点吗?
这是您要使用 join 语句的地方。
var result = from r in records
join c in user1.claims on r.claims.Contains(c)
select r;
在英语中,这是说对于我们拥有的每条记录,我们都匹配至少有一个声明与用户的声明相匹配的记录,并且只返回这些记录。这还假设您已经实施了 Equals
和 GetHashCode
方法,以便您可以比较声明。
您正在尝试获取所有记录,其中所有记录的声明都在该其他用户的声明集合中。您可以编写一个或多或少类似于这些规范的 LINQ 查询:
var query = records.Where(record =>
record.Claims.All(recordClaim => user.Claims.Contains(recordClaim));
请注意,如果 user.Claims
是任意大小的集合,并且您在 LINQ to objects 中执行此操作而不是使用数据库的查询提供程序,则应将这些声明放入 HashSet
首先(在查询之外),因为这将帮助它更好地扩展。