Alexey Gamzov just sent me an example showing how EF deals with large local collections.
Query:
SQL:
Query:
from edge in session.GetAll<Edge>() join nodeId in nodes on edge.ChildId equals nodeId select edge.ParentIdnodes is local collection of 60+ GUIDs (IEnumerable<Guid>).
SQL:
SELECT
[Extent1].[ParentId] AS [ParentId]
FROM [dbo].[Edges] AS [Extent1]
INNER JOIN (SELECT
[UnionAll66].[C1] AS [C1]
FROM (SELECT
[UnionAll65].[C1] AS [C1]
FROM (SELECT
[UnionAll64].[C1] AS [C1]
FROM (SELECT
[UnionAll63].[C1] AS [C1]
FROM (SELECT
[UnionAll62].[C1] AS [C1]
-- 60 more similar constructions
FROM (SELECT
[UnionAll1].[C1] AS [C1]
FROM (SELECT
cast('5b029492-7aaf-4253-a347-a85eca6d08e0' as uniqueidentifier) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable1]
UNION ALL
SELECT
cast('bc83a784-87d8-45a0-b3f9-5a74be942ee1' as uniqueidentifier) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable2]) AS [UnionAll1]
UNION ALL
SELECT
cast('ee7acdbb-73d4-4228-bcc6-b83dcc22d286' as uniqueidentifier) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable3]) AS [UnionAll2]
-- 60 more similar constructions
UNION ALL
SELECT
cast('e6c729f2-fd19-43e1-9209-094d165cd551' as uniqueidentifier) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable63]) AS [UnionAll62]
UNION ALL
SELECT
cast('ed1c2991-75bc-4123-b524-ce9f9cee090a' as uniqueidentifier) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable64]) AS [UnionAll63]
UNION ALL
SELECT
cast('0d5809e3-c841-4e1a-956d-ffca42446ac9' as uniqueidentifier) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable65]) AS [UnionAll64]
UNION ALL
SELECT
cast('17574132-f67c-4622-aba9-abcde209a886' as uniqueidentifier) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable66]) AS [UnionAll65]
UNION ALL
SELECT
cast('cbadcf79-0b51-4f96-8c95-b9576f31878c' as uniqueidentifier) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable67]) AS [UnionAll66]
UNION ALL
SELECT
cast('55c50611-3745-47b3-af50-fdec7458b19d' as uniqueidentifier) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable68]) AS [UnionAll67] ON [Extent1].[ChildId] = [UnionAll67].[C1]
Obviously, it fails - maximum subquery nesting level on SQL Server is 32. Luckily, it was possible to get rid of join in this case:Query:
from edge in session.GetAll<Edge>() where nodes.Contains(edge.ChildId) select edge.ParentIdSQL:
SELECT
[Extent1].[ParentId] AS [ParentId]
FROM [dbo].[Edges] AS [Extent1]
WHERE [Extent1].[ChildId] IN (
cast('5b029492-7aaf-4253-a347-a85eca6d08e0' as uniqueidentifier),
-- About 60 more similar constructions
cast('55c50611-3745-47b3-af50-fdec7458b19d' as uniqueidentifier)
)
It works ;) Although it's a bit strange they don't parameterize GUIDs here.




ReplyDeleteنقل عفش من الرياض الى جدة نقل عفش من الرياض الى جدة
نقل عفش من الرياض الى جدة نقل عفش من الرياض الى جدة