We funcletize ICollection.Count, if passed as a parameter, e.g.
var localList = new List<int> { 1, 2, 3 };
var query = context.Categories.Select(c => localList.Count);
produces the following query:
SELECT
@p__linq__0 AS [C1]
FROM [dbo].[Categories] AS [Extent1]
/*
Int32 p__linq__0 = 3
*/
However, if we inline the list:
var query = context.Categories.Select(c => new List<int> { 1, 2, 3 }.Count);
it doesn't get funcletized and the query we produce is much uglier:
SELECT
[GroupBy1].[A1] AS [C1]
FROM [dbo].[Categories] AS [Extent1]
CROSS JOIN (SELECT
COUNT(1) AS [A1]
FROM (SELECT
1 AS [C0]
FROM (SELECT
1 AS [C0]
FROM ( SELECT 1 AS X ) AS [SingleRowTable1]
UNION ALL
SELECT
1 AS [C0]
FROM ( SELECT 1 AS X ) AS [SingleRowTable2]) AS [UnionAll1]
UNION ALL
SELECT
1 AS [C0]
FROM ( SELECT 1 AS X ) AS [SingleRowTable3]) AS [UnionAll2] ) AS [GroupBy1]
var localList = new List<int> { 1, 2, 3 };
var query = context.Categories.Select(c => localList.Count);
produces the following query:
SELECT
@p__linq__0 AS [C1]
FROM [dbo].[Categories] AS [Extent1]
/*
Int32 p__linq__0 = 3
*/
However, if we inline the list:
var query = context.Categories.Select(c => new List<int> { 1, 2, 3 }.Count);
it doesn't get funcletized and the query we produce is much uglier:
SELECT
[GroupBy1].[A1] AS [C1]
FROM [dbo].[Categories] AS [Extent1]
CROSS JOIN (SELECT
COUNT(1) AS [A1]
FROM (SELECT
1 AS [C0]
FROM (SELECT
1 AS [C0]
FROM ( SELECT 1 AS X ) AS [SingleRowTable1]
UNION ALL
SELECT
1 AS [C0]
FROM ( SELECT 1 AS X ) AS [SingleRowTable2]) AS [UnionAll1]
UNION ALL
SELECT
1 AS [C0]
FROM ( SELECT 1 AS X ) AS [SingleRowTable3]) AS [UnionAll2] ) AS [GroupBy1]