我有一個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)))
爲什麼不能像我所期望的那樣工作?寫這個查詢的最好方法是什麼?
你是否期待在整個查詢或者每個serviceConnectionId返回一個值陣列? – Oliver
我期待爲查詢獲取單個值(站點)。我試圖找到與所有三個服務連接相關的網站,而不是其他網站。所以,就你而言,在那裏應該有一個SingleOrDefault或Select,但我需要首先接近250k的結果。 :-)我確實有一個解決方法,它可以將站點鏈接到任何服務連接,然後使用SequenceEqual將它們全部匹配。但我沒有看到原始查詢的問題。 –
爲什麼你不這樣使用? db.Sites .Where(x => x.LinkSiteUtilityServiceConnections.All(y => serviceConnectionIds.Contains(y.UtilityServiceConnectionId)))。Count(); – NEER