如何选择每个项目与列表中所有项目之间存在引用的项目

本文关键字:项目 之间 存在 引用 列表 选择 何选择 | 更新日期: 2023-09-27 17:56:33

我有一个名为Keywords的对象列表,每个对象都有一个Id。

在我的数据库中,我有一个Forms表和一个KeywordReferences表。

每个KeywordReference都有一个FormId和一个KeywordId

我需要做的是创建一个查询,该查询获取该表单的Id与原始列表中所有Keywords之间存在KeywordReference的所有Forms

所以基本上我有一些Forms,比如:

Form:
Name: Test1
Id: 1
Form:
Name: Test2
Id: 2

然后几个KeywordReferences

KeywordReference:
FormId: 1
KeywordId: 1
KeywordReference: 
FormId: 1
KeywordId: 2
KeywordReference:
FormId: 2
KeywordId: 2

然后我有一个Keywords列表:

Keyword: 
Name: Primary
Id: 1
Keyword: 
Name: Secondary
Id: 2

查询应返回 Test1 ,因为存在要为列表中所有KeywordTest1 KeywordReference

它不应该返回Test2因为该表单仅与 Keywords 中的一个项目匹配。

如何编写这样的查询?

编辑 这是一个查询示例,该查询获取列表中关键字与给定表单之间发生任何匹配的所有表单,但我需要编写一个所有匹配项发生的查询:

    var forms = from form in db.Forms    
                join reference in db.KeywordReferences on form.Id equals reference.FormId 
                join filter in filters on reference.DepartmentKeywordId equals filter.Id    reference in the filter
                select form;

如何选择每个项目与列表中所有项目之间存在引用的项目

您需要存在所有关键字,因此请测试keywords.All

在针对所有人的测试中,您需要有一个匹配的相关关键字引用,因此测试keywordReferences.Any

from f in forms
where keywords.All(
  kw => keywordReferences.Any(
    kr => kr.KeywordId == kw.Id && kr.FormId == f.Id))
select f;