LINQ to SQL select 多对多精确匹配记录 table

LINQ to SQL select exact matching record from many to many table

我需要帮助来查找 SQL 中的匹配记录。 我下面的 table 缓解了多对多问题,其中 GridToPageID 是主键,并且可以有多个具有不同 PageID 的单个 GridID 实例。

在我的应用程序中,参数将与特定的 PageID 列表一起传递,我需要查询并仅查找与传递的 PageID 的确切数量匹配的记录。 当我使用下面的查询查询 SQL 时,它 return 向我发送了所有具有 2 个和更多匹配项的记录,而我只想获得一个恰好具有那些 2.

的记录
SELECT [GridID]
  FROM [AgencySalesAgreementU01].[dbo].[GridToPage]  
  where PageID in('11aida','30aida') --or any number
  group by gridid
  having COUNT (GridToPageID) = 2 --match the number of PageID's passed

这是在 LinqPad

中测试的同一个 linq-to-sql 查询
string[] allpages ={"11aida","30aida"};//,"32aida"};

var result = from gtp in GridToPage 
where allpages.Contains(gtp.PageID) 
group gtp by gtp.GridID into grp
where grp.Count() == allpages.Count() 
select grp.Key;
result.Dump();

上面查询的结果 returns GridID 为 261、263 和 266,我希望它 return 只有 261。 如果我传递三个 PageID,我需要它 return 263 和 266。 同样,对于 PageID '11aida',它将 return 268.

这一简单的更改应该可以解决您的问题。将 DISTINCT 添加到您的 HAVING COUNT() 并将您计算的内容更改为 PageID。

编辑:所以您想要返回一个 ID,该 ID 与您想要返回的号码完全相同,并且返回的号码与您要检查的号码相同?为此,您需要比较两个聚合。

SELECT [GridID]
FROM 
    [AgencySalesAgreementU01]
    .[dbo].[GridToPage]
GROUP BY gridid
HAVING SUM(CASE WHEN PageID 
                IN (
                    '11aida', 
                    '30aida'
                    ) THEN 1 ELSE 0 END) 
    = 2
    -- This checks that both were found.
    AND COUNT(DISTINCT PageID
    ) = 2 
    --this checks that the total found is only 2

这样,您将查找该列表中有多少个不同的 PageID 与每个 GridID 一起出现,然后保留那些与您要查找的计数相匹配的 GridID。让我知道这是否有效。

您应该先将数字分组,然后在分组内确定所有 PageID 是否都在 allpages 列表中:

string[] allpages ={"11aida","30aida"};//,"32aida"};
var count = allpages.Count();

var result = from gtp in GridToPage 
group gtp by gtp.GridID into grp
where grp.Count() == count 
   && grp.All(x => allpages.Contains( x.PageID))
select grp.Key;