gpt4 book ai didi

c# - CompiledQuery 与普通 Linq SQL 生成

转载 作者:行者123 更新时间:2023-11-30 19:51:46 30 4
gpt4 key购买 nike

所以我对访问 SQLServer 数据库的不同方法进行了一些分析。我做了普通的 TSQL、一个 CompiledQuery 和一个非编译的 Linq 语句。

正如预期的那样,性能按照相同的顺序进行,但我在分析后两者时发现了一些奇怪的东西。

CompiledQuery 生成的 SQL 比普通的旧语句生成的 SQL 好得多。

本地SQLExpress数据库;表称为“foreignTable”,ColumnA 是 int,主键(索引); ColumnB 是一个随机整数。

Func<testingDatabaseEntities1, int, int> GetByPK = CompiledQuery.Compile((testingDatabaseEntities1 ft, int key) 
=> (ft.foreignTable.Where(x => x.ColumnA == key).FirstOrDefault().ColumnB));

生成

SELECT 
[Project1].[ColumnB] AS [ColumnB]
FROM ( SELECT cast(1 as bit) AS X ) AS [SingleRowTable1]
LEFT OUTER JOIN (SELECT TOP (1)
[Extent1].[ColumnB] AS [ColumnB]
FROM [dbo].[foreignTable] AS [Extent1]
WHERE [Extent1].[ColumnA] = @p__linq__1 ) AS [Project1] ON 1 = 1

对于生成的代码,这真的不是可怕的。

但是当我执行普通的 Linq 语句时:

entity.foreignTable.Where(x => x.ColumnA == searchForMe).FirstOrDefault().ColumnB

它产生:

SELECT 
[Limit1].[C1] AS [C1],
[Limit1].[ColumnA] AS [ColumnA],
[Limit1].[ColumnB] AS [ColumnB],
[Limit1].[FKColumn] AS [FKColumn]
FROM ( SELECT TOP (1)
[Extent1].[ColumnA] AS [ColumnA],
[Extent1].[ColumnB] AS [ColumnB],
[Extent2].[FKColumn] AS [FKColumn],
1 AS [C1]
FROM [dbo].[foreignTable] AS [Extent1]
LEFT OUTER JOIN (SELECT
[Table_2].[FKColumn] AS [FKColumn],
[Table_2].[SomeText] AS [SomeText]
FROM [dbo].[Table_2] AS [Table_2]) AS [Extent2] ON [Extent1].[ColumnA] = [Extent2].[FKColumn]
WHERE [Extent1].[ColumnA] = @p__linq__7
) AS [Limit1]

这很糟糕。

所以我想问题是:是否可以为实体提供与 CompiledQuery 相同数量的 SQL suckness 的常规 Linq?

最佳答案

您正在比较的查询不相同。第一个编译查询返回一个属性,没有别的。它永远不会返回任何不同的东西。第二个返回一个实体实例,您取消引用该实例然后访问其属性。当查询执行时,它无法知道您打算只查看一个属性。

您可能能够从非编译查询中获取相同 SQL 的一种方法(未经测试)是投影到匿名类型中:

var b = (from e in entity.foreignTable.
where ColumnA == searchForMe
select new
{
ColumnB = e.ColumnB
}).FirstOrDefault().ColumnB;

关于c# - CompiledQuery 与普通 Linq SQL 生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/701946/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com