实体框架LINQ查询匹配子集合的所有成员

时间:2016-07-06 19:20:41

标签: entity-framework linq

我有一个Site表,它使用名为LinkSiteUtilityServiceConnection的链接表与UtilityServiceConnection表具有多对多关系。给定一组ServiceConnectionIds,我需要找到专门链接到所有这些站点的站点,而不是更多。我想我应该可以在集合上使用All编写查询,但它没有按预期工作。

var serviceConnectionIds = new[] { 546892, 546911, 546923 };

var sites1 = db.Sites
               .Where(x => x.LinkSiteUtilityServiceConnections.All(y => serviceConnectionIds.Contains(y.UtilityServiceConnectionId)))
               .ToList();
Assert.AreEqual(1, sites1.Count); //fails

这会产生下面的查询,当我希望得到一个时,它会返回~250,000条记录。

SELECT [Extent1].*
FROM   [dbo].[Site] AS [Extent1]
WHERE  NOT EXISTS (SELECT 1 AS [C1]
                   FROM   [dbo].[LinkSiteUtilityServiceConnection] AS [Extent2]
                   WHERE  ([Extent1].[SiteId] = [Extent2].[SiteId])
                          AND ((NOT ([Extent2].[UtilityServiceConnectionId] IN (546892, 546911, 546923)))
                                OR (CASE
                                      WHEN ([Extent2].[UtilityServiceConnectionId] IN (546892, 546911, 546923)) THEN cast(1 as bit)
                                      WHEN (NOT ([Extent2].[UtilityServiceConnectionId] IN (546892, 546911, 546923))) THEN cast(0 as bit)
                                    END IS NULL)))

为什么所有人都没有按照我的预期工作?编写此查询的最佳方式是什么?

1 个答案:

答案 0 :(得分:1)

检查此代码:

查询1:

var sites1 = db.Sites
    .Where(x => serviceConnectionIds.All(y =>             
                x.LinkSiteUtilityServiceConnections
                    .Select(u => u.UtilityServiceConnectionId).Contains(y)))
    .ToList();

查询2:

var query = db.Posts.AsQueryable();
var sites1 = serviceConnectionIds.Aggregate(query, 
    (current, item) => current.Where(e => e.LinkSiteUtilityServiceConnections
        .Any(c => c.UtilityServiceConnectionId== item))).ToList();