如何在SQL Server中查询具有多个键/值对约束的记录?

时间:2015-02-13 09:34:00

标签: sql-server linq entity-framework tsql

我正在使用Entity Framework,并且拥有一个具有键/值对集合的实体。我希望能够根据这些对搜索实体。

以下是我的表格:

StoredDocuments:

enter image description here

StoredDocumentKeywordValues:

enter image description here

因此,如果我搜索具有键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 ......

2 个答案:

答案 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的交集。