Linq NOT IN (或 NOT EXISTS)、LEFT JOIN踩坑记

原先项目中有SQL语句NOT IN,把它改造成Linq

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 同理

 

转载于:https://www.cnblogs.com/liuyouying/p/5190159.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值