LINQ中的连接和子查询

时间:2010-03-15 21:11:30

标签: c# linq subquery left-join

我正在尝试使用子查询进行连接,但似乎无法获得它。这是在sql中工作的样子。我怎样才能在linq工作?

SELECT po.*, p.PermissionID
FROM PermissibleObjects po
 INNER JOIN PermissibleObjects_Permissions po_p ON (po.PermissibleObjectID = po_p.PermissibleObjectID)
 INNER JOIN Permissions p ON (po_p.PermissionID = p.PermissionID)
 LEFT OUTER JOIN
  (
  SELECT u_po.PermissionID, u_po.PermissibleObjectID
  FROM Users_PermissibleObjects u_po
  WHERE u_po.UserID = '2F160457-7355-4B59-861F-9871A45FD166'
  ) used ON (p.PermissionID = used.PermissionID AND po.PermissibleObjectID = used.PermissibleObjectID)
WHERE used.PermissionID is null

2 个答案:

答案 0 :(得分:1)

如果没有看到您的数据库和数据模型,就不可能提供任何真正的帮助。但是,最好的方法可能是:

  • 下载linqpad - http://www.linqpad.net/
  • 创建与数据库的连接
  • 从最里面的部分开始 - 带有“where”子句的子查询
  • 让每个小查询工作,然后加入它们。 Linqpad将向您显示生成的SQL以及结果,因此请构建您的小查询,直到它们正确

所以,基本上,将你的问题分成更小的部分。 Linqpad很棒,因为它可以让你测试这些东西,并在你去的时候检查你的结果

希望这会有所帮助,祝你好运

托比

答案 1 :(得分:0)

查询的LINQ翻译非常简单:

from pop in PermissibleObjectPermissions
where !pop.UserPermissibleObjects.Any (
  upo => upo.UserID == new Guid ("2F160457-7355-4B59-861F-9871A45FD166"))
select new { pop.PermissibleObject, pop.PermissionID }

单词:“从所有对象权限中,检索具有至少一个用户权限的用户权限,其用户ID为2F160457-7355-4B59-861F-9871A45FD16”。

您会注意到此查询使用关联属性来导航关系 - 这样就无需“加入”并简化查询。因此,LINQ查询与原始SQL查询的英文描述更接近。

编写LINQ查询时的诀窍是摆脱将SQL音译成LINQ的习惯。