使用JOIN和SubQuery的SQL到LINQ

时间:2016-03-04 21:55:12

标签: linq linq-to-sql

我有一个查询,我'努力转换为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行的那些。

2 个答案:

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

相关问题