在LINQ中,Join和从嵌套查询中选择第一个项目有什么区别

时间:2012-06-27 18:29:08

标签: c# linq linq-to-sql join

这是一些选择所有订单详情的LINQ。它使用product表创建连接以获取产品名称:

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 };

如果我不知道加入存在,我会怎么做:

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代码。第一种方法比第二种方法更快,如果是这样,为什么呢?

ETA:

db.Log for join query:

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 for 2nd query:

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]

2 个答案:

答案 0 :(得分:3)

连接通常比等效的嵌套选择更快,因为DBMS'非常擅长优化连接,尽管一个好的SQL编译器可能无论如何都可以优化它们到相同的SQL。你应该使用那个使你的目的更清晰的那个,这可能是这种情况下的连接。

答案 1 :(得分:1)

您在没有连接的情况下提供的第二个示例执行所谓的“相关子查询”,并且通常比连接慢。结果是一样的,但不同之处在于获得这些结果的表现。你应该赞成加入。

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