如何在Linq to sql中进行left join

可以用 into 语法,配合 DefaultIfEmpty() 方法加载右侧表中的空值。

例子:

var query =
from r in db.Roles
join sr in
(
from ss in db.StaffInRoles
where ss.StaffId == staffId
select ss
)
on r.Id equals sr.RoleId
into x
from y in x.DefaultIfEmpty()
select new RoleInfo
{
RoleId = r.Id,
RoleName = r.Name,
IsSet = y != null
};

注意这里最后可以通过 y != null 来判断右值是否为空。

这个 Linq to sql 语句生成的对应 SQL 为:

exec sp_executesql N'SELECT [t0].[Id] AS [RoleId], [t0].[Name] AS [RoleName],
(CASE
WHEN [t2].[test] IS NOT NULL THEN 1
ELSE 0
END) AS [IsSet]
FROM [Role] AS [t0]
LEFT OUTER JOIN (
SELECT 1 AS [test], [t1].[StaffId], [t1].[RoleId]
FROM [StaffInRole] AS [t1]
) AS [t2] ON ([t0].[Id] = [t2].[RoleId]) AND ([t2].[StaffId] = @p0)',N'@p0 int',@p0=1
over.

时间: 2016-07-05
Tags: isset, select, linq, from

如何在Linq to sql中进行left join的相关文章

如何在LINQ To SQL中使用继承

有的时候我们在设计数据库的时候发现如果完全把商务逻辑中的类影射到表中可能会照成数据库中很多表都很相似,甚至结构上都是一样的,下面举一个例子来说明如何处理这种情况.假设我们正在创建一个图书销售网站,但客户却希望这个图书销售网站可能需要销售其他产品,在业务逻辑层我们可能设计如下: 表结构设计如下:

在Linq to Sql中管理并发更新时的冲突(3):使用记录的时间戳

在<在Linq to Sql中管理并发更新时的冲突(2):引发更新冲突>一文中 ,我们描述了Linq to Sql检测在更新时是否产生了冲突的基本方法:将该记录 每个字段原来的值和更新时的值进行对比,如果稍有不同则意味着记录被修改过 ,因此产生了更新冲突.不过您是否有这样的感觉,这种方法实在累赘了一些? 如果一个表中有数十个字段,那么更新就必须完整地检测一遍(不过我会在今后 的文章中提到这方面的控制).再者,如果其中某一个字段储存了洋洋洒洒上万 字的文章,那么在验证时仅仅是将它从Web服务器发

在LINQ to SQL中使用Translate方法以及修改查询用SQL

目前LINQ to SQL的资料不多--老赵的意思是,目前能找到的资 料都难以摆脱"官方用法"的"阴影".LINQ to SQL最 权威的资料自然是MSDN,但是MSDN中的文档说明和实例总是显得"大开大 阖",依旧有清晰的"官方"烙印--这简直是一 定的.不过从按照过往的经验,在某些时候如果不按照微软划定的道道来走,可 能就会发现别样的风景.老赵在最近的项目中使用了LINQ to SQL作为数据层的基础,在LINQ to S

Linq to SQL中的实体继承

现在的Linq To Sql只支持单表继承,不支持一实体一具体表和一实体一扩展表等方式继承.什么是单 表继承呢?所谓单表继承就是把整个继承体系存储在数据库的一个表中.由此可以知道,这个表结构包括 所有实体的属性字段,如果在该继承体系中,实体的数量较多,就会产生大量的null值的数据,这样浪费 了很多的数据存储空间.不过所有的继承体系放在一个表中,逻辑简单容易操作,数据量不大的时候效率 也高.下面看看在Linq To Sql中是怎样实现单表继承的(用Orcas白皮书中的示例来说明). 假如现在有这

在Linq to Sql中管理并发更新时的冲突(2) 引发更新冲突

在上一讲中,我们提到了一些诸如"乐观并发控制"."悲 观并发控制"的概念,以及察看Linq to Sql自动生成sql语句的方法.从 这篇文章起我们将继续来查看Linq to Sql在管理并发更新时是如何发现冲突问 题的. 要使用Linq to Sql,我们自然需要一个数据库环境.为了说明问 题,我们这里使用一个非常简单的数据表. 我们这里创建了一个Video表,只有3个字段,没有约束,没有外键 --我们只要能够说明问题就可以了,不是吗? VideoID:主 键,i

在Linq to Sql中管理并发更新时的冲突(1) 预备知识

无论与目前的ORM框架相比有没有优势,Linq to Sql在语言和平台的级别上 为我们提供了一种新的操作对象和数据的方式,在一定程度上为我们解决了 Object != Data的问题.在实际应用中,对于数据库的操作往往有着天生的并发 性,因此在更新数据时可能会产生冲突.有些时候,如果没有合理的解决冲突问 题,轻则让用户摸不着头脑,重则让系统数据处于一种不一致的状态.Linq to Sql自然考虑到了这一点,本系列讨论的内容,就是在使用Linq to Sql时,如何 管理并发更新时产生的冲突.

LINQ TO SQL中SQLMetal和Mapping文件缺陷

Mapping文件的缺陷 开发LINQ TO SQL,我个人倾向选择外部配置文件的方式进行开发,灵活,(这个也是.Net平台下的建议选择,如果你了解WCF,会更有体会). 利用SQLMeatal开发Mapping文件的时候,在修改Association节的DeleteRule属性的时候,感觉是LING TO SQL的缺陷. MSND: NET Framework 类库 AssociationAttribute..::.DeleteRule 属性 更新:2007 年 11 月 获取或设置关联的删除

LINQ to SQL语句(4)之Join

Join操作符 适用场景:在我们表关系中有一对一关系,一对多关系, 多对多关系等.对各个表之间的关系,就用这些实现对多个表的操作. 说明:在Join操作中,分别为Join(Join查询), SelectMany(Select一对多选择) 和GroupJoin(分组Join查询). 该扩展方法对两个序列中键匹配的元素进 行inner join操作 SelectMany 说明:我们在写查询语句时,如果 被翻译成SelectMany需要满足2个条件.1:查询语句中没有join和into,2:必 须出现

Linq to SQL之使用存储过程(2)

本文接着上篇文章Linq to SQL之使用存储过程 (1),继续探讨如何在Linq to SQL中使用存储过程. 在写存储过程的时候,有时候会用到返回值而不是output参数,现在看看怎样取到该返回值呢? 比如这样一个存储过程: create procedure dbo.linqDemo4 @input varchar(20) as select * from customers return 20 设计器自动生成的函数如下,可以看到并没有提供方式取到该存储过程的返回值: [Function(