Объединения и подзапросы в LINQ - PullRequest
1 голос
/ 16 марта 2010

Я пытаюсь выполнить объединение с подзапросом и не могу его получить. Вот как выглядит работа в 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 ]

1 голос
/ 16 марта 2010

Не видя вашей базы данных и модели данных, практически невозможно предложить какую-либо реальную помощь. Но, вероятно, лучший способ это сделать:

  • скачать linqpad - http://www.linqpad.net/
  • создать соединение с вашей базой данных
  • начать с самого внутреннего фрагмента - подзапроса с предложением "where"
  • приведите в действие каждый маленький запрос, затем присоединитесь к ним. Linqpad покажет вам сгенерированный SQL, а также результаты, поэтому постройте ваши маленькие запросы, пока они не будут правильными

Итак, в основном, разбейте вашу проблему на более мелкие части. Linqpad - это фантастика, так как он позволяет вам проверять эти вещи и проверять результаты по ходу работы

надеюсь, это поможет, удачи

Toby

0 голосов
/ 16 марта 2010

Перевод 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 }

Словами: «Из всех разрешений объекта извлекайте те, у кого есть хотя бы одно разрешение пользователя, чей UserID равен 2F160457-7355-4B59-861F-9871A45FD16».

Вы заметите, что этот запрос использует свойства ассоциации для навигации по отношениям - это устраняет необходимость в "объединении" и упрощает запрос. В результате запрос LINQ намного ближе к своему описанию на английском языке, чем исходный запрос SQL.

Хитрость при написании запросов LINQ состоит в том, чтобы избавиться от привычки "транслитерировать" SQL в LINQ.

...