2016-03-04 89 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