我有一个名为Keywords
的对象列表,每个对象都有一个Id。
在我的数据库中,我有一张Forms
表和一张KeywordReferences
表。
每个KeywordReference
都有一个FormId
和一个KeywordId
。
我需要做的是创建一个查询,以获取Forms
所有KeywordReference
,其中Id
和所有之间存在Keywords
原始列表中的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
查询应返回KeywordReference
,因为列表中的所有Test1
项都存在Keyword
到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;
中的一个项目。
我该如何撰写这样的查询?
编辑这是一个查询示例,它可以获取列表中的关键字与给定表单之间发生任何匹配的所有表单,但我需要编写一个查询所有匹配的位置:
refund
答案 0 :(得分:3)
您需要所有关键字,因此请测试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;