LINQ 中的 JOIN 和 LEFT JOIN 等效项

2023-11-26

我正在使用以下 SQL 查询:

SELECT 
a.AppointmentId,
a.Status,
a.Type,
a.Title,
b.Days,
d.Description,
e.FormId
FROM Appointment a (nolock)
LEFT JOIN AppointmentFormula b (nolock)
ON a.AppointmentId = b.AppointmentId and b.RowStatus = 1
JOIN Type d (nolock)
ON a.Type = d.TypeId
LEFT JOIN AppointmentForm e (nolock)
ON e.AppointmentId = a.AppointmentId
WHERE a.RowStatus = 1
AND a.Type = 1
ORDER BY a.Type

我不确定如何在 LINQ 中实现 JOIN。我的所有表都有外键关系。


SELECT A.X, B.Y
FROM A JOIN B ON A.X = B.Y

此 linq 方法调用(对 Join)将生成上述 Join。

var query = A.Join
(
  B,
  a => a.x,
  b => b.y,
  (a, b) => new {a.x, b.y} //if you want more columns - add them here.
);

SELECT A.X, B.Y
FROM A LEFT JOIN B ON A.X = B.Y

这些 linq 方法调用(对 GroupJoin、SelectMany、DefaultIfEmpty)将产生上面的 Left Join

var query = A.GroupJoin
(
  B,
  a => a.x,
  b => b.y,
  (a, g) => new {a, g}
).SelectMany
(
  z => z.g.DefaultIfEmpty(),
  (z, b) =>
    new  { x = z.a.x, y = b.y } //if you want more columns - add them here.
);

这里的关键概念是 Linq 的方法产生分层形状的结果,而不是扁平的行列形状。

  • Linq's GroupBy生成以层次结构形式形成的结果,其中分组键与收藏元素(可能不为空)。 SQL 的GroupBy子句产生一个分组键合计值- 没有可以使用的子集合。
  • 同样,Linq 的GroupJoin产生一个分层形状 - 父记录与收藏子记录(可能为空)。 sql的LEFT JOIN生成与每个子记录匹配的父记录,如果没有其他匹配,则生成空子记录。要从 Linq 的形状到达 Sql 的形状,必须使用以下命令解压子记录集合SelectMany- 并使用处理空子记录集合DefaultIfEmpty.

这是我尝试对问题中的 sql 进行解析:

var query =
  from a in Appointment
  where a.RowStatus == 1
  where a.Type == 1
  from b in a.AppointmentFormula.Where(af => af.RowStatus == 1).DefaultIfEmpty()
  from d in a.TypeRecord //a has a type column and is related to a table named type, disambiguate the names
  from e in a.AppointmentForm.DefaultIfEmpty()
  order by a.Type
  select new { a.AppointmentId, a.Status, a.Type, a.Title, b.Days, d.Description, e.Form }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LINQ 中的 JOIN 和 LEFT JOIN 等效项 的相关文章

随机推荐

  • 移动 unsigned int 超过它的大小,是否未定义?

    2011 年草案说 6 5 7 移位运算符 4E1 and J 2 未定义的行为表达式移动负数或移动大于或等于表达式宽度的量 促进表达 6 5 7 两者如何解读 做J 2指所有移位 无符号或无符号 或第节中明确提到的 UB6 5 7 仅适用
  • 向上拉 n 行而不移动

    要在不移动光标的情况下向下拉 7 行 我可以7yy 是否可以向上执行相同的操作 而不使用宏或重新映射 您可以使用 yank具有范围的命令可以实现此效果 6 yank 范围说明 或者点表示当前行 6表示当前行减 6 6 是当前行减去 6 到当
  • 哪个 Rails 插件最适合基于角色的权限? (请为每个答案提供一个提名)

    我需要向我的 Rails 应用程序添加基于角色的权限 并且想知道有哪些最好的插件值得研究 我目前正在使用 RESTful 身份验证插件来处理用户身份验证 为什么您建议的插件比其他插件更好 我必须推荐 easy roles 它的重量超轻 不需
  • 隐式本地化法语中的“Required”注释

    太长了 如何获得的行为 Required ErrorMessage Le champ 0 est obligatoire 当只写的时候 Required 据我了解文档不提供隐式本地化一组给定 DataAnnotations 的方法 我想要注
  • MongoRepository 查询日期之间的信息

    我的波乔 public class PacketData implements Serializable private static final long serialVersionUID 1L Id private final Stri
  • 可见内联div用fancyBox显示后消失

    我在这里发布问题和解决方案 以帮助与我遇到相同问题的任何人 我有一个 div 在我的页面上 我想允许用户通过单击图标来 缩放 这 div 没有隐藏 我用了 fancyBox fancybox主页 来显示 div 作为一种模式窗口 我使用 f
  • 如何使用 JAXB 读取 XML 文件?

    我使用 JAXB 从 XML 模式生成 Java 类 现在我想读取包含这些类的 XML 文件 但不能 我试试这个 JAXBContext jaxbContext JAXBContext newInstance STDMP class Unm
  • Task.Run() 和await Task.Run() 有什么区别?

    以下程序是使用通用Task Run 并使用async和await 异步 设计的 在这两种情况下 都会从线程池中取出不同的线程来执行新任务 那么区别是什么呢 异步意味着它应该使用主线程并释放它直到任务完成 但它也使用另一个线程而不是使用主线程
  • 验证单个字段中的多个电子邮件地址

    有没有一种方法可以在单个输入字段中验证一个或多个电子邮件地址 我目前正在探索的方法是创建一个自定义指令 如果检测到逗号 则将输入拆分为不同的电子邮件 这是我到目前为止所拥有的 angular module myApp directive m
  • 为什么我的 Android 设备宽度是 980px?

    我很困惑 我正在尝试通过媒体查询来使网站具有响应能力 根据大多数消息来源 例如this 用于智能手机的 mediq query 是max device width 480px and min device width 320px 但是当我使
  • 通过 imp.load_source 加载具有相同名称的模块,从而导致模块合并

    我想知道以下行为是预期的还是错误 我正在使用CPython2 7 创建文件x py def funcA print funcA of x py def funcB print funcB of x py 创建文件 y py def func
  • 线程 1:在断点 1 处停止

    我的 XCode 4 3 2 有问题 我不知道它是什么 我已经设置了一个断点 但是 XCode 在设置断点的行处停止 它向我显示了线程日志 我在这里要疯了 这就是我在 XCode 中看到断点时看到的页面 它在几个项目中做到了这一点 并在启用
  • Windows 10 Mobile - 无法隐藏状态栏(上下文中不存在状态栏)

    我正在尝试隐藏 Windows 10 通用应用程序中的状态栏 在 WP 8 1 中 我使用StatusBar GetForCurrentView HideAsync 隐藏状态栏 但这在我当前的项目 Monogame Win10 UAP 中不
  • 如何模糊 Android 中的视图或布局?

    我正在尝试模糊视图或布局 如下例所示 到目前为止 我只看到了模糊图像的示例 并且对如何在布局上实现模糊感到困惑 我希望你们能帮忙 Cheers None
  • 如何使用两个依赖于另一个的 XMLHttpRequest?

    我正在开发一个项目 其中有 2 个 XMLHttpRequest 对象 例如 A 和 B 我想要完成的是 当A完成获取数据项列表时 将触发B根据A之前获取的数据项来获取更多项目 目前我的问题是这两个对象彼此独立工作 我的代码如下 var A
  • 一次从矩阵中选择特定元素

    有没有办法可以从矩阵中一次选择一堆预先指定的元素 具体来说 假设我有以下矩阵 58 59 60 62 63 64 58 0 000000 3 772139 6 367721 8 978718 12 197210 13 401126 59 3
  • 子查询中的 LINQ“.Ininclude”orderby

    我有以下实体代码 它返回所有用户并 包含 他们的所有示例请求 var userQuery from u in IntranetContext UserSet Include SampleRequests orderby u LastName
  • 如何创建或用另一个数组填充 numpy 数组?

    如何创建具有形状的 numpy 数组 2 2 3 其中轴 2 处的元素是另一个数组 例如 1 2 3 所以我想做这样的事情 无效代码 a np arange 1 4 b np full 3 3 a 得到一个像这样的数组 1 2 3 1 2
  • 如何在 AngularJS 中设置重复元素 id?

    我想做这样的事情 div class row div div div 但是当在控制器中时我尝试 function SetterForCatanCtrl scope scope try var tile document getElement
  • LINQ 中的 JOIN 和 LEFT JOIN 等效项

    我正在使用以下 SQL 查询 SELECT a AppointmentId a Status a Type a Title b Days d Description e FormId FROM Appointment a nolock LE