我正在使用Entity Framework,并且拥有一个具有键/值对集合的实体。我希望能够根据这些对搜索实体。
以下是我的表格:
StoredDocuments:
StoredDocumentKeywordValues:
因此,如果我搜索具有键k1和值v1的实体,我想要StoredDocumentIds 1和2.
如果我搜索k1 / v1,k2 / v2,我只想要StoredDocumentId 1
如果我搜索k1 / v1,k4 / v4,我什么都没得到
linq声明是理想的,但我无法弄清楚。最接近我使用SQL将所有单独的键/值语句ORing在一起,但是键/值不存在的情况让我感到震惊。我真正需要的是所有的键/值对ANDed:
如果StoredDocument有K1,V1和K2,V2和K3,V3 ......
答案 0 :(得分:1)
var query = db.StoredDocumentKeywords;
foreach (var kv in kvlist)
{
query = query.where (p => p.keyword == kv.Key && p.Value == kv.Value)
}
return query.Select(p => p.StoredDocumentId).Distinct();
答案 1 :(得分:1)
抱歉,我不知道EF
挑战在于条件是单行,单行没有多个值
在TSQL中
select storedDocumentID
from table
where (keywork = 'k1' and value = 'v1')
or (keywork = 'k2' and value = 'v2')
group by storedDocumentID
having count(*) = 2
您也可以使用Intersection和Join来实现,但我认为这更容易
如果LINQ不直接执行,你可以输出out in hashsets,然后取出hashsets的交集。