2016-03-04 7 views
1

У меня есть запрос, который я пытаюсь преобразовать в LINQ. Я просто не могу окунуться в нужное гнездо. Вот запрос в SQL (просто руки типизированных):SQL to LINQ with JOIN и SubQuery

SELECT V.* FROM V 
INNER JOIN VE ON V.ID = VE.V_ID 
WHERE VE.USER_ID != @USER_ID 
    AND V.MAX > (SELECT COUNT(ID) FROM VE 
    WHERE VE.V_ID = V.ID AND VE.STATUS = 'SELECTED') 

Ближайший я пришел это:

var query = from vac in _database.Vacancies 
         join e in _database.VacancyEngagements 
          on vac.Id equals e.VacancyId into va 
         from v in va.DefaultIfEmpty() 
         where vac.MaxRecruiters > (from ve in _database.VacancyEngagements 
                where ve.VacancyId == v.Id && ve.Status == Enums.VacanyEngagementStatus.ENGAGED 
                select ve).Count() 

... который правильно решает подзапрос из моего SQL заявления. Но я хочу еще больше ограничить возвращенные строки V только теми, где текущий пользователь не имеет связанной строки VE.

+0

Вы можете поместить 'where e.UserId! = UserId' прямо перед ключевым словом' to'. –

+0

@GertArnold, что приводит к синтаксической ошибке: «тело запроса должно заканчиваться предложением select или предложением группы» – sfkHooper

+0

В вашем запросе уже отсутствовал 'select' в конце. –

ответ

1

Я понял, что SQL в вопросе был вводящим в заблуждение, и в то время как это приводило к технически правильным ответам, они не были тем, чем я был. Это моя ошибка в том, что я не рассматриваю SQL правильно, поэтому прошу прощения за @Andy B и @Ivan Stoev за вводящую в заблуждение публикацию. Вот LINQ, который решил проблему для меня. Как указано в сообщении, мне нужно было показать строки вакансий, где не было связанных строк вакансий. ! оператор предоставляет возможность указать это с помощью подзапроса.

var query = from vac in _database.Vacancies 
          where !_database.VacancyEngagements.Any(ve => (ve.VacancyId == vac.Id && ve.UserId == user.Id)) 
          && vac.MaxRecruiters > (from ve in _database.VacancyEngagements 
               where ve.VacancyId == vac.Id && ve.Status == Enums.VacanyEngagementStatus.ENGAGED 
               select ve).Count() 
0

Это должно работать:.

var filterOutUser = <userId you want to filter out>; 

var query = from vac in _database.Vacancies 
join e in _database.VacancyEngagements 
          on vac.Id equals e.VacancyId        
where (e.UserId != filterOutUser) && vac.MaxRecruiters > (from ve in _database.VacancyEngagements 
                  where ve.VacancyId == vac.Id && ve.Status == Enums.VacanyEngagementStatus.ENGAGED 
                  select ve).Count() 
     select vac; 

я удалил присоединиться к VacancyEngagements, но если вам нужны столбцы из этой таблицы вы можете добавить его в

+0

Спасибо, Энди Б. Это выражение действительно работает, и на самом деле я начал. Но он не разрешает вторую часть вопроса, исключая V-записи, где USER_ID имеет связанную запись VE. – sfkHooper

+0

Прошу прощения, я немного поправляю ответ позже. –

+0

Привет, Энди. Как и другой ответ, этот запрос возвращает нулевые результаты, если таблица VacancyEngagements пуста. Мне нужно, чтобы он возвращал строки в вакансиях, за исключением тех, где связанный (v.Id равно ve.VacancyId). Для данного пользователя существует версия VacancyEngagement (ve.UserId) – sfkHooper