【问题标题】:How do I query SQL Server for a record with multiple key/value pair constraints?如何在 SQL Server 中查询具有多个键/值对约束的记录?
【发布时间】:2015-02-13 09:33:59
【问题描述】:

我正在使用实体框架,并且有一个包含键/值对集合的实体。我希望能够根据这些对搜索实体。

这是我的桌子:

存储文档:

StoredDocumentKeywordValues:

因此,如果我搜索具有键 k1 和值 v1 的实体,我想要 StoredDocumentIds 1 和 2。

如果我搜索 k1/v1、k2/v2,我只需要 StoredDocumentId 1

如果我搜索 k1/v1、k4/v4,我什么也得不到

linq 语句是理想的,但我想不通。最接近我使用 SQL 的方法是将所有单独的键/值语句 ORing 在一起,但是键/值不存在的情况让我感到震惊。我真正需要的是所有键/值对 AND 在一起:

如果存储文档有 K1,V1 AND K2,V2 AND K3,V3 ...

【问题讨论】:

    标签: sql-server linq entity-framework tsql


    【解决方案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 不直接执行此操作,您可以在哈希集中输出输出,然后取哈希集的交集。

    【讨论】:

    • 你的答案是我的想法,只是没想到把'有计数......'放在sql中
    【解决方案2】:
    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();
    

    【讨论】:

    • 我认为这会给我一个满足列表中任何内容的存储文档列表。我需要满足列表中所有内容的文件。我会试一试看看
    • 对不起,忽略了这一点,正在调整我的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 2010-10-24
    • 2020-09-01
    • 2012-08-18
    • 1970-01-01
    相关资源
    最近更新 更多