当我意识到 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
可以做到这一点。这就是第一个查询的工作方式。
如果您的数据提供程序知道order
和customer
之间的联系,那么这些将相当于同一件事。
如果数据提供程序不知道连接,则第一个示例中的方法将导致 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。