LINQ中join语法大探究(多表关联),也有不少疑问

平时我们使用sql语句。一般很少只用一个表来做操作。大多数都要用到多个表的操作。那么多表关联就必不可少。
在linq也提供这样的强大功能。但是毕竟sql语句和linq中的语法有些差异。导致linq中的关联操作比较join语法等不相同的。
下面通过几个列子来说明这些操作
工具vs2008beta2标准版和sqlserver2000
我们知道其实linq最终还是生成了相应的sql来操作数据库的。如果对linq语法不明白可以通过linq生成的sql来看明白。
datacontext有个属性Log很重要的啊。可以生成我们想看的sql
如果建立的是控制台应用程序可以这样:datacontext.log = Console.out;
如果是其他项目可以生成日志文件来查看。
StreamWriter sw = new StreamWriter(Server.MapPath("sqlLog.txt"), true); // Append
&<60;dc.Log = sw;
。。。//执行代码
sw.flush();
sw.close();这样就可以拉

这其中涉及建立上下文datacontext和数据库链接。已经实体类建立和linq to sql classes的设计器等这里是不做讲解的。可以查看其他文章
本文以sqlserver2000的northwind为列

第一个:
&<60;DataClassesDataContext dc = new DataClassesDataContext();
var infoQuery =
from cust in dc.Customers
from ord in dc.Orders
where cust.City == "London"
select ord;
Page.Response.Write(infoQuery.Count().ToString()+"<br/>");
这个执行后产生的sql如下
SELECT COUNT(*) AS [value]
FROM [dbo].[Customers] AS [t0], [dbo].[Orders] AS [t1]
WHERE [t0].[City] = 'London'
这就是简单的笛卡尔乘积拉。加了一个条件限制。结果就是customer表和orders的数量的乘积。
第二个:
var infoQuery =
from prod in dc.Products
where prod.Supplier.Country == "USA" && prod.UnitsInStock == 0
select prod;
products 和 suppliers 是有外键关联的 。对应的sql是这个:
SELECT COUNT(*) AS [value]
FROM [dbo].[Products] AS [t0]
LEFT OUTER JOIN [dbo].[Suppliers] AS [t1] ON [t1].[SupplierID] = [t0].[SupplierID]
WHERE ([t1].[Country] = 'USA') AND ([t0].[UnitsInStock] = 0)
使用的左外键链接
第三个:
var infoQuery =
from emp in dc.Employees
from empterr in emp.EmployeeTerritories
where emp.City == "Seattle"
select new
{
emp.FirstName,
emp.LastName,
//empterr.Territory.TerritoryDescription
};
对应的sql

SELECT COUNT(*) AS [value]
FROM [dbo].[Employees] AS [t0], [dbo].[EmployeeTerritories] AS [t1]
WHERE ([t0].[City] = 'Seattle') AND ([t1].[EmployeeID] = [t0].[EmployeeID])
两个表没有链接。说实话我也头晕拉。select * from t1,t2 where这种写法在sqlserver是比较少用的。也不推荐使用
第四个: var q =
&&&&&&
&&&&这个疑问比较多
查询数量的时候产生sql如下

SELECT COUNT(*) AS [value]
FROM [dbo].[Customers] AS [t0]
循环是这样:
SELECT [t0].[ContactName], (
&&&&FROM [dbo].[Customers] AS [t0]
我看不懂了。哈哈

还有个:
&&&&&&&&&
&&&&let这个表达式。
SELECT [t1].[ContactName], [t2].[OrderID], [t1].[value]
FROM (
&&&CROSS JOIN [dbo].[Orders] AS [t2]
WHERE [t1].[CustomerID] = [t2].[CustomerID]
就是那个+号了

本文使用Blog_Backup未注册版本导出,请到soft.pt42.com注册。

原文地址:https://www.cnblogs.com/zjypp/p/2319490.html