是否有必要在 Linq to Sql 中使用联接



当我意识到 linq to sql 可以通过两种方式从数据库中检索数据时,我今天正在练习,我创建了两个 datagrid,并使用两种不同的方法来填充每个数据网格,它们产生了相同的结果。

第一种方法是使用 joins 从相关表中获取数据,其他方法是像对象一样使用 linq 查询来访问相关表。代码如下所示:

NorthWindDataContext dbContext = new NorthWindDataContext();
        var orders = from ord in dbContext.Orders
                     select new { ord.ShipCountry , ord.Customer.ContactName};
        var orders2 = from ord in dbContext.Orders
                     join cust in dbContext.Customers on ord.CustomerID equals cust.CustomerID
                     select new
                     {
                         ord.ShipCountry, cust.ContactName
                     };
        var data = orders2;
        DataGrid.ItemsSource= orders;
        DataGrid2.ItemsSource = orders2;

我的问题是,就像标题一样,是否完全有必要使用joins,因为我发现有时使用它们真的很麻烦。

您需要使用从订单到客户的东西。

Join可以做到这一点。这就是第二个查询的工作方式。

order"了解"customer可以做到这一点。这就是第一个查询的工作方式。

如果您的数据提供程序知道ordercustomer之间的联系,那么这些将相当于同一件事。

如果数据提供程序不知道连接,则第一个示例中的方法将导致 N + 1 次查找,而不是 1 次。

只要存在适当的关系标记属性,linq友好的ORM通常会知道这些连接(只是Linq2SQL,EF,NHibernate等之间的区别(。

对于提供程序不知道关系的情况,或者您有理由加入外键关系以外的其他内容,了解join方法仍然很重要。

答案是">有点"。 由于您使用的是 ORM(如 Linq-to-Sql(,因此您不需要直接在 linq 查询中调用 join 来完成您尝试执行的操作。

但是,当ORM激活查询时,它将生成实际的SQL代码,其中包含一个join语句,以获取您正在查询的结果。 但是,由于您使用的是ORM,因此返回的数据将映射到对象,并且由于客户在对象之间具有关系,因此该关系也将从数据库转换为对象。

ord.Customer.ContactName

上述语句很可能被翻译成在客户和订单之间执行INNER JOIN的 JOIN 语句。

因此,这两个 LINQ 查询很可能会生成类似的 SQL 查询。 两者都有一个 JOIN 语句。 由于对象之间的关系也存在于数据库中(并且所有内容都映射在一起显示此关系(,因此无需直接在 LINQ 语句中使用 join。

相关内容

  • 没有找到相关文章