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()
).
当您调用SingleOrDefault
时MyQuery
,您正在执行查询,该查询将结果加载到客户端.
SingleOrDefault返回IEnumerable<T>
不再是IQueryable<T>
.此时您已经强制它将在客户端上进行所有进一步处理 - 它不能再执行SQL组合.
归档时间: |
|
查看次数: |
2632 次 |
最近记录: |