【发布时间】:2015-04-08 16:26:46
【问题描述】:
如何在LINQ to SQL的外连接中使用let语句?
如下所示,
from a in tableA
from b in tableB.where(o => a.Key == o.Key).DefaultIfEmpty() //outer join
let x = b.objectBB
where b != null && x != null && x.FilterCode == "X"
所以,
- 上面的查询可以吗?
- 如果 'b' 为空,'let' 会失败吗?
- 'x' 上的 where 子句会发生什么?这个过滤器工作正常吗?
任何更好的方法来实现这一点也非常受欢迎。!
【问题讨论】:
-
这肯定会在 linq to object 中失败,因为
let被翻译成where子句的selectahead,但很有可能它会起作用在 linq to sql 中很好。 -
嗯:a) C# 区分大小写;当您尝试调用该方法时,
where应该是Where; b) 如果 b 为空,您如何期望o.Key匹配开头的 where 子句? c) 您的查询末尾没有 select 或 group 子句... d) 您尝试过吗?如果您想知道查询是否“正常”,您应该做的第一 件事就是尝试一下。如果它在快速测试中工作,那么它可能 没问题(尽管这不能保证) - 但如果它无法编译(这样会)那么它显然 不是 很好。 -
@Jon skeet:是的,我测试了它(最后有一个'select a',我错过了在这里添加)它正在获取预期的结果。但我不确定它是正确的查询方式还是更好的查询方式。
-
正如我所提到的,由于
where与Where的关系,该代码无论如何都不会编译...这让我想知道 else 与您的真实情况有何不同代码。但这实际上只是一个左外连接——这就是你想要的吗?我不愿意以当前形式使用查询(在修复编译器错误之后),因为它“逻辑上”是错误的——例如,如果b为空,它会在 LINQ to Objects 下失败。 (我现在知道它是怎么回事了,并从之前的评论中收回我的观点 b。)但正如 Brett 指出的那样,如果您要求b不为空,那么您只是在寻找一个内部连接(更多)