我有一个名为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
,因为存在要为列表中所有Keyword
项Test1
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;