如何强制LINQ to SQL来评估数据库中的整个查询?

TN.*_*TN. 14 .net c# sql linq linq-to-sql

我有一个完全可以转换为SQL的查询.由于未知原因,LINQ决定最后一次Select()在.NET中执行(而不是在数据库中),这会导致针对数据库运行大量额外的SQL查询(每个项目).

实际上,我找到了一种强制完全转换为SQL的"奇怪"方法:

我有一个查询(这是一个非常简化的版本,仍然没有按预期工作):

MainCategories.Select(e => new
{
    PlacementId = e.CatalogPlacementId, 
    Translation = Translations.Select(t => new
    {
        Name = t.Name,
        // ...
    }).FirstOrDefault()
})
Run Code Online (Sandbox Code Playgroud)

它会生成很多SQL查询:

SELECT [t0].[CatalogPlacementId] AS [PlacementId]
FROM [dbo].[MainCategories] AS [t0]

SELECT TOP (1) [t0].[Name]
FROM [dbo].[Translations] AS [t0]

SELECT TOP (1) [t0].[Name]
FROM [dbo].[Translations] AS [t0]

...
Run Code Online (Sandbox Code Playgroud)

但是,如果我追加另一个Select()只复制所有成员:

.Select(e => new
{
    PlacementId = e.PlacementId, 
    Translation = new
    {
        Name = e.Translation.Name,
        // ...
    }
})
Run Code Online (Sandbox Code Playgroud)

它会将其编译为单个SQL语句:

SELECT [t0].[CatalogPlacementId] AS [PlacementId], (
    SELECT [t2].[Name]
    FROM (
        SELECT TOP (1) [t1].[Name]
        FROM [dbo].[Translations] AS [t1]
        ) AS [t2]
    ) AS [Name]
FROM [dbo].[MainCategories] AS [t0]
Run Code Online (Sandbox Code Playgroud)

任何线索为什么?如何强制LINQ to SQL更一般地生成单个查询(没有第二次复制Select())?

注意:我已更新查询,使其非常简单.

PS:只是,我得到的想法是使用类似的模式后处理/转换查询(添加另一个Select()).

Jor*_*mer 6

当您调用SingleOrDefaultMyQuery,您正在执行查询,该查询将结果加载到客户端.

SingleOrDefault返回IEnumerable<T>不再是IQueryable<T>.此时您已经强制它将在客户端上进行所有进一步处理 - 它不能再执行SQL组合.