我有一个查询,我'努力转换为LINQ。我无法绕过所需的筑巢。这是SQL中的查询(只是徒手打印):
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 :(得分:1)
我已经意识到问题中的SQL是误导性的,虽然它导致了技术上正确的答案,但它们并不像我追求的那样。这是我没有正确审查SQL的错,所以我向@Andy B和@Ivan Stoev道歉,因为这个误导性的帖子。这是为我解决问题的LINQ。如帖子中所述,我需要显示空缺行,其中不存在链接的vacancyEngagement行。的!运算符提供了使用子查询指定它的能力。
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()
答案 1 :(得分: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,但如果您需要该表中的列,则可以将其重新添加。