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

标签 c# linq linq-to-sql join

这里有一些用于选择所有订单详细信息的 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]

最佳答案

连接通常比同等的嵌套选择更快,因为 DBMS 非常擅长优化连接,尽管好的 SQL 编译器可能会将它们优化为相同的 SQL。您应该使用使您的目的更加明确的那个,这可能就是本例中的联接。

关于c# - 在 LINQ 中,Join 和从嵌套查询中选择第一项有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11232735/

相关文章:

c# - 自定义类型的 Dapper 数组

c# - 将 DataTable 转换为 XML 文件,反之亦然

c# - LINQ 查找 2D 交错数组最小值,返回索引

c# - 我可以让这个 Linq to EF 更有效率吗?

c# - 为什么要检查 Match.Success

c# - 如何编写一个 LINQ If Else 语句,如果检查结果为 false 则不返回任何值(即使是 null)?

c# - 如何将 List<string> 中的 Uri 转换为 List<Uri>?

c# - 如何为 Json.net 生成 json 对象的所有可能的 LINQ 字符串?

c# - 使用 recordType 的对象更新 Linq2Sql 中的记录

c# - 如何编写 LINQ to SQL 查询以获取今天的日期记录?