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()
我有一个正在努力转换为 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()