2016-07-06 91 views
1

我有一個Site表格,它與使用名爲LinkSiteUtilityServiceConnection的鏈接表的UtilityServiceConnection表格有多對多的關係。給定一組ServiceConnectionIds,我需要找到專門鏈接到它們的網站,而不是更多。我想我應該能夠在集合上使用All編寫查詢,但它不像預期的那樣工作。實體框架LINQ查詢匹配子集合的所有成員

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))) 

爲什麼不能像我所期望的那樣工作?寫這個查詢的最好方法是什麼?

+0

你是否期待在整個查詢或者每個serviceConnectionId返回一個值陣列? – Oliver

+0

我期待爲查詢獲取單個值(站點)。我試圖找到與所有三個服務連接相關的網站,而不是其他網站。所以,就你而言,在那裏應該有一個SingleOrDefault或Select,但我需要首先接近250k的結果。 :-)我確實有一個解決方法,它可以將站點鏈接到任何服務連接,然後使用SequenceEqual將它們全部匹配。但我沒有看到原始查詢的問題。 –

+0

爲什麼你不這樣使用? db.Sites .Where(x => x.LinkSiteUtilityServiceConnections.All(y => serviceConnectionIds.Contains(y.UtilityServiceConnectionId)))。Count(); – NEER

回答

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(); 
+0

這似乎工作。但是,分析器顯示它正在爲每個服務連接ID生成一個查詢聯合,所以它不能很好地擴展。你對我的原始查詢有什麼想法嗎? –

+0

plz檢查查詢2 –