2

这是一些用于选择所有订单详细信息的 LINQ。它创建与产品表的连接以获取产品名称:

var query = from od in db.Order_Details
            join p in db.Products on od.ProductID equals p.ProductID
            select new { od.OrderID, od.ProductID, p.ProductName };

如果我不知道 Join 存在,我会这样做:

var query = from od in db.Order_Details
            select new { od.OrderID, 
                         od.ProductID, 
                         ProductName = (from p in db.Products 
                                        where p.ProductID == od.ProductID 
                                        select p.ProductName).First()
            };

它们生成不同的底层 SQL 代码。第一种方法是否比第二种方法快,如果是,为什么?

预计到达时间:

db.Log 用于连接查询:

SELECT [t0].[OrderID], [t0].[ProductID], [t1].[ProductName]
FROM [dbo].[Order Details] AS [t0]
INNER JOIN [dbo].[Products] AS [t1] ON [t0].[ProductID] = [t1].[ProductID]

db.Log 用于第二个查询:

SELECT [t0].[OrderID], [t0].[ProductID], (
    SELECT TOP (1) [t1].[ProductName]
    FROM [dbo].[Products] AS [t1]
    WHERE [t1].[ProductID] = [t0].[ProductID]
    ) AS [ProductName]
FROM [dbo].[Order Details] AS [t0]
4

2 回答 2

3

连接通常比等效的嵌套选择更快,因为 DBMS 非常擅长优化连接,尽管一个好的 SQL 编译器可能会将它们优化为相同的 SQL。您应该使用使您的目的更明确的那个,在这种情况下可能是 join。

于 2012-06-27T18:48:12.743 回答
1

您提供的没有连接的第二个示例执行所谓的“相关子查询”,并且通常比连接慢。结果是相同的,但不同的是获得这些结果的性能。你应该赞成加入。

http://msdn.microsoft.com/en-us/library/ms187638%28v=sql.105%29.aspx

于 2012-06-27T18:55:04.953 回答