【问题标题】:let statement and outer join in LINQ to SQLLINQ to SQL 中的 let 语句和外连接
【发布时间】: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"

所以,

  1. 上面的查询可以吗?
  2. 如果 'b' 为空,'let' 会失败吗?
  3. 'x' 上的 where 子句会发生什么?这个过滤器工作正常吗?

任何更好的方法来实现这一点也非常受欢迎。!

【问题讨论】:

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

标签: c# sql .net linq


【解决方案1】:

在我看来,如果您希望双方都不为空,您不只是想要一个内部联接吗?

from a in tableA
join b in tableB on a.Key equals o.Key
where b.FilterCode == "X"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 2015-02-28
    • 1970-01-01
    • 2014-08-25
    • 2011-10-14
    • 1970-01-01
    相关资源
    最近更新 更多