这是一些选择所有订单详情的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]
答案 0 :(得分:3)
连接通常比等效的嵌套选择更快,因为DBMS'非常擅长优化连接,尽管一个好的SQL编译器可能无论如何都可以优化它们到相同的SQL。你应该使用那个使你的目的更清晰的那个,这可能是这种情况下的连接。
答案 1 :(得分:1)
您在没有连接的情况下提供的第二个示例执行所谓的“相关子查询”,并且通常比连接慢。结果是一样的,但不同之处在于获得这些结果的表现。你应该赞成加入。
http://msdn.microsoft.com/en-us/library/ms187638%28v=sql.105%29.aspx