Linq NOT IN (或 NOT EXISTS)、LEFT JOIN踩坑记
2016-02-15 11:19
295 查看
原先项目中有SQL语句NOT IN,把它改造成Linq
网上搜到的都是这种方法,在子查询后Contains判断是否包含
如果是NOT EXISTS,也可以用 .Any(m=>...)
看上去很简单没什么问题,测试时发现报错,【此上下文仅支持基元类型或枚举类型】,反复检查测试,花了半上午。。。
后来发现这种写法只支持一个实体,如果是多个实体,要分开写。(应该是EF中映射实体才有这问题,普通linq应该是可以的)
中文网上都没有提到这码事,只在stackoverflow上找到一篇,就是说的这个问题
======================
LEFT JOIN:
Linq居然没有LEFT JOIN。。。就不能把SQL关键字统统做个对应么。。。
要使用into和DefaultIfEmpty,并且要在赋值时判断null
RIGHT JOIN 同理
var b = from e in YY where !( from c in XX where c.XXId == 123 select c.XXId ).Contains(e.YYId)
网上搜到的都是这种方法,在子查询后Contains判断是否包含
如果是NOT EXISTS,也可以用 .Any(m=>...)
看上去很简单没什么问题,测试时发现报错,【此上下文仅支持基元类型或枚举类型】,反复检查测试,花了半上午。。。
后来发现这种写法只支持一个实体,如果是多个实体,要分开写。(应该是EF中映射实体才有这问题,普通linq应该是可以的)
var a = from c in XX where c.XXId == 123 select c.XXId; var b = from e in YY where !a.Contains(e.YYId)
中文网上都没有提到这码事,只在stackoverflow上找到一篇,就是说的这个问题
http://stackoverflow.com/questions/16836516/error-message-only-primitive-types-or-enumeration-types-are-supported-in-this
======================
LEFT JOIN:
Linq居然没有LEFT JOIN。。。就不能把SQL关键字统统做个对应么。。。
from a in b left join c in d on a.xx equal c.xx into e from f in e.DefaultIfEmpty() select new { a.XX, YY = f==null? "" : f.YY }
要使用into和DefaultIfEmpty,并且要在赋值时判断null
RIGHT JOIN 同理
相关文章推荐
- JAVA反射机制的应用场景
- windows和linux监听端口数据的方法
- linux学习笔记六:加载USB移动硬盘(NTFS格式)
- linux调试工具gdb初步学习
- HTML5与php实现消息推送功能
- mass的domReady方案
- 计算几何
- YUM常用命令介绍
- linux学习笔记五:加载U盘
- chomp用法
- UncaughtException处理类,当程序发生Uncaught异常的时候,由该类来接管程序,并记录发送错误报告.
- 带角标的ImageView
- XCTest 测试实战
- 我最常用的几个Xcode快键键
- 【BZOJ2814】tree
- iOS 【KVC的拓展-key&keyPath区别/修改私有属性/取值/数组求和&平均值】
- 记录自己的码农进军之路
- RxJava系列之二:RxJava简介
- linux学习笔记四:安装lsusb
- Android.mk 和Application.mk 示例