是否有必要在Linq中使用连接到Sql

时间:2015-05-17 16:50:52

标签: c# sql-server wpf linq linq-to-sql

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

第一种方法是使用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,因为我发现它们有时候使用起来非常麻烦。

2 个答案:

答案 0 :(得分:1)

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

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

order知道customer可以做到这一点。这是第一个查询的工作方式。

如果您的数据提供商知道ordercustomer之间的关联,那么这些将相同。

如果您的数据提供者不知道连接,那么第一个示例中的方法将导致N + 1查找而非1。

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

了解join方法对于提供者不了解关系,或者您有理由加入外键关系以外的事情仍然很重要。

答案 1 :(得分:0)

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

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

ord.Customer.ContactName

上述陈述很可能被转换为在客户和客户之间执行INNER JOIN的JOIN语句。订单。

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