Подзапрос SQL в LINQ для Entity Framework 4.0

Я новичок в LINQ и EF, но я мог наткнуться на большинство моих запросов, но этот меня полностью сбил с толку. Независимо от того, что я пробую, в SQL Profiler это вызывает большой беспорядок :-).

У меня есть две таблицы: Users и UsersProjects. Цель этого запроса - вывести список всех пользователей, которые работают над проектами с указанным пользователем. Вот запрос, который я написал на SQL. Это подзапрос, но я не знаю, как его еще больше упростить, но я тоже открыт для предложений.

SELECT DISTINCT Users.FirstName, Users.LastName  
FROM Users INNER JOIN UsersProjects ON Users.ID=UsersProjects.UserID  
WHERE UsersProjects.ProjectID IN  
(SELECT ProjectID FROM UsersProjects WHERE UserID=@UserID)  

Кто-нибудь может помочь ?? Это кажется довольно простым подзапросом в SQL, но в LINQ я сбит с толку.

Спасибо,

Джорин


person Jorin    schedule 03.05.2010    source источник


Ответы (1)


Что-то вроде этого, я думаю:

from u in Users
from projectId in UsersProjects.Where(up => up.UserId == @userId).Select(p => p.ProjectId)
where u.UsersProjects.Any(up => projectId == up.ProjectId)
select u

или (это ваш sql-запрос в linq)

(from u in Users
join up in UsersProjects on @userId equals up.UserId
where u.UsersProjects.Any(up2 => up2.ProjectId == up.ProjectId)
select u).Distinct()
person MeF Corvi    schedule 03.05.2010
comment
Нет, это просто связывает пользователей с пользовательскими проектами. Все, что он возвращает, - это информация о пользователе, которая существует в пользовательских проектах. Для получения дополнительной информации этот запрос в профилировщике отображается как SELECT [Extent1]. [ID] AS [ID], [Extent1]. [FirstName] + N '' + [Extent1]. [LastName] AS [C1] FROM [dbo ]. [Пользователи] КАК [Extent1] ГДЕ СУЩЕСТВУЕТ (ВЫБЕРИТЕ 1 КАК [C1] ИЗ [dbo]. [UsersProjects] КАК [Extent2] ГДЕ ([Extent1]. [ID] = [Extent2]. [UserID]) И ( 1 = [Extent2]. [UserID])) - person Jorin; 04.05.2010
comment
Мне жаль. Мой первый вопрос был определенно неправильным. Новый запрос возвращает правильный результат, но я не уверен, можно ли выполнить запрос без подвыбора. - person MeF Corvi; 04.05.2010
comment
Потрясающие! Это отлично работает ... и в этом тоже есть смысл. Я поигрался с ним в LINQPad и смог реконструировать то, что происходило в этом лямбда-выражении Any, и я думаю, что понял. Большое спасибо, MeF! - person Jorin; 04.05.2010