SQL 使用 JOIN 和 SubQuery 到 LINQ

SQL to LINQ with JOIN and SubQuery

我有一个正在努力转换为 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 行的行。

这应该有效:

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 的连接,但如果您需要该 table 中的列,您可以将其重新添加。

我意识到问题中的 SQL 具有误导性,虽然它导致了技术上正确的答案,但它们并不是我所追求的。这是我没有正确审查 SQL 的错,所以我向@Andy B 和@Ivan Stoev 为误导性的 post 道歉。这是为我解决问题的 LINQ。如 post 中所述,我需要显示不存在链接的 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()