我今天练习的时候,我意识到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
,因为我发现它们有时候使用起来非常麻烦。
答案 0 :(得分:1)
您需要使用从订单到客户的东西。
Join
可以做到这一点。这是第二个查询的工作方式。
order
知道customer
可以做到这一点。这是第一个查询的工作方式。
如果您的数据提供商知道order
和customer
之间的关联,那么这些将相同。
如果您的数据提供者不知道连接,那么第一个示例中的方法将导致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语句中使用连接。