2016-03-04 70 views
1

我有一个查询,我努力转换为LINQ。我无法满足所需的嵌套。下面是SQL查询(只是写意键入):SQL到LINQ JOIN和子查询

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

您可以在'into'关键字之前放置'where e.UserId!= userId'。 –

+0

@GertArnold,这会导致语法错误:“查询正文必须以select子句或group子句结尾” – 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

谢谢,安迪B.这种表达方式确实有效,它实际上是我开始的地方。但它不能解决问题的第二部分,从而消除了USER_ID具有链接的VE记录的V记录。 – sfkHooper

+0

对不起,我稍后会提供答案 –

+0

嗨,安迪。如同另一个答案,如果VacancyEngagements表为空,则此查询返回零结果。我需要的是它返回Vacancies中的行,不包括给定用户存在链接(v.Id等于ve.VacancyId)VacancyEngagement行的行(ve.UserId) – sfkHooper