LINQ TO SQL 中join
类别:编程学习 浏览量:1679
时间:2014-11-27 LINQ TO SQL 中join
LINQ TO SQL 中join一、LINQ to SQL中join的特点
1、包含join和on关键字,如果只有join没有on,会报语法错误。
2、外键关联时,用的是关键字equals,而不能像SQL一样用等号。
3、必须显示调用要显示的字段。即要出现select 字段,否则会报错。
二、LINQ to SQL中join实例
1、用join关联两张表
var q =
from c in db.Customers
join o in db.Orders on c.CustomerID
equals o.CustomerID into orders
select new
{
c.ContactName,
OrderCount = orders.Count()
};
生成SQL语句为:
SELECT [t0].[ContactName], (
SELECT COUNT(*)
FROM [dbo].[Orders] AS [t1]
WHERE [t0].[CustomerID] = [t1].[CustomerID]
) AS [OrderCount]
FROM [dbo].[Customers] AS [t0]
实例2
var p = from u in entities.Customers
where u.City=="London"
join n in entities.Orders on u.CustomerID
equals n.CustomerID
into order //具有相同的customerid的orders为一组到order中
select new
{
u.CustomerID,
order,
Count=order.Count()
};
对这种方法的说明:如果我们要使用这种方法来遍历所有的记录,可以这样写:
foreach (var m in p)
{
foreach (var mm in m.order)
Console.WriteLine(m.CustomerID + "" +
mm.OrderID + " " + mm.Customers.City);
}
2、左外部联接(Left Outer Join):通过使用DefaultIfEmpty() 获取左外部联接。
下例中,在雇员没有订单时,DefaultIfEmpty()方法返回null:
var q =
from e in db.Employees
join o in db.Orders on e equals o.Employee into ords
from o in ords.DefaultIfEmpty()
select new
{
e.FirstName,
e.LastName,
Order = o
};
3、多表联接
var q =
from c in db.Customers
join o in db.Orders on c.CustomerID
equals o.CustomerID into ords
join e in db.Employees on c.City
equals e.City into emps
select new
{
c.ContactName,
ords = ords.Count(),
emps = emps.Count()
};
生成的SQL语句
SELECT [t0].[ContactName], (
SELECT COUNT(*)
FROM [dbo].[Orders] AS [t1]
WHERE [t0].[CustomerID] = [t1].[CustomerID]
) AS [ords], (
SELECT COUNT(*)
FROM [dbo].[Employees] AS [t2]
WHERE [t0].[City] = [t2].[City]
) AS [emps]
FROM [dbo].[Customers] AS [t0]
4、join组合键过滤
var q =
from o in db.Orders
from p in db.Products
join d in db.OrderDetails
on new
{
o.OrderID,
p.ProductID
} equals
new
{
d.OrderID,
d.ProductID
}
into details
from d in details
select new
{
o.OrderID,
p.ProductID,
d.UnitPrice
};
5、join中显示如何构造一侧可为 null 而另一侧不可为 null 的联接
var q =
from o in db.Orders
join e in db.Employees
on o.EmployeeID equals
(int?)e.EmployeeID into emps
from e in emps
select new
{
o.OrderID,
e.FirstName
};
标签:LINQ
您可能感兴趣
- 如何查看linq生成的sql
- linq to sql 中Concat、Union、Intersect、Except
- Linq操作Datable
- linq 数据类型转换
- linq xml 查询
- linq 排序
- datatable linq查询
- linq中AsEnumerable和AsQueryable的区别
- 使用 LINQPad 调试linq以及lambda表达式
- list使用linq排序
- linq中延迟执行
- linq distinct去重
- linq中join用法
- LINQ TO SQL 中join
- linq中let
- LINQ中Aggregate的用法
- 8月再见 9月你好(8月再见)
- 魔兽世界 设计师爆料,原始版本并无PVP,跨阵营属于返璞归真(魔兽世界设计师爆料)
- 吐槽完《弧光大作战》之后,我们和设计师聊了聊魔兽首款手游的立项初衷和未来(吐槽完弧光大作战之后)
- 魔兽争霸3自定义战役少年杰雷 2(魔兽争霸3自定义战役少年杰雷)
- 今日菜价 芥兰涨幅最高 1.33 ,花菜降幅最高 3.10(今日菜价芥兰涨幅最高)
- 今日菜价 椰菜涨幅最高 3.25 ,水空心菜降幅最高 2.58(今日菜价椰菜涨幅最高)
热门推荐
- mysql对null值如何理解(MySQL为Null会导致5个问题个个致命)
- 护卫神主机大师教程(护卫神主机大师Linux登录账户密码忘记的解决办法)
- vue如何获取元素(vue第一次获取不到元素的解决方法记录)
- mysql备份工具怎么选(MySQL使用Xtrabackup备份流程详解)
- mysql 慢查询排查方法(MYSQL慢查询和日志实例讲解)
- docker配置和启动(Docker的安装与配置命令代码实例)
- php防session劫持(使用SMB共享来绕过php远程文件包含的限制执行RFI的利用)
- js中alert加参数写法(详解JavaScript Alert函数执行顺序问题)
- css的内外边距均设置为0(详解css边距重叠的几种解决方案)
- sql语句行转列怎么设置(SQL行转列和列转行代码详解)