为什么这个 linq 查询:

(from c in Orders
select new
{
   Id=c.Id,
   DeliveryDate = c.DeliveryDate.Value
}).Take(10)

被翻译成
SELECT TOP (10) [t1].[Id], [t1].[value] AS [DeliveryDate]
FROM (
    SELECT [t0].[Id], [t0].[DeliveryDate] AS [value]
    FROM [Orders] AS [t0]
    ) AS [t1]

但是当我将 DeliveryDate = c.DeliveryDate.Value 更改为 DeliveryDate = c.DeliveryDate 时,SQL 查询看起来很简单:
SELECT TOP (10) [t0].[Id], [t0].[DeliveryDate]
FROM [Orders] AS [t0]

最佳答案

我认为这是因为 LINQ2SQL 的翻译器优化不足。使用“属性”( Value )会触发子查询的创建,结果证明这是不必要的。

值得注意的是,任何物有所值的 RDBMS 都会为两个 SQL 查询生成相同的查询计划,因此最终无论哪种方式都无关紧要。

10-06 09:37