LINQ to SQL从多个表中选择精确匹配的记录

时间:2015-09-28 18:03:14

标签: c# sql sql-server linq linq-to-sql

我需要帮助在SQL中查找匹配的记录。 我的下表缓解了很多问题,其中GridToPageID是主键,并且可能存在具有不同PageID的单个GridID的许多实例。

enter image description here

在我的应用程序中,参数将与特定的PageID列表一起传递,我需要查询并查找仅与传递的PageID的确切数量匹配的记录。 当我使用下面的查询查询SQL时,它返回所有具有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();

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

2 个答案:

答案 0 :(得分:0)

这一个简单的改变应该可以解决您的问题。将DISTINCT添加到您的HUNT COUNT()并将您想要的内容更改为PageID。

编辑:所以你想要一个返回的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

这样,您正在查找每个GridID显示该列表中有多少个不同的PageID,然后保留那些与您要查找的计数匹配的GridID。如果有效,请告诉我。

答案 1 :(得分:0)

您应首先对这些数字进行分组,然后在该组中确定所有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;