2016-12-19 141 views
2

我想在我的linq查詢中使用實體框架複製MS Access「IIf」語句。條件語句linq查詢

如果Journal.Frequency =「Ad hoc」和Journal.AdHocRecoMonth <>「提供了重載」,則在列表中包含日誌。

這裏是整個查詢:

SELECT DISTINCT Users.ID as UserID, Users.FirstName, Users.Surname,User.ADID 
FROM Users INNER JOIN Journals ON Users.ID = Journals.UserID 
WHERE(((Journals.CompanyID) = {1}) AND((Journals.RRDD) = '{2}') AND 
((IIf([Journals].[Frequency] = 'Ad hoc' And [Journals].[AdHocRecoMonth] <> '{0}', 'NO', 'YES')) = 'YES')); 

到目前爲止我的代碼不包括if語句:

var fUsers = (from u in db.Users from j in u.Journals 
       where j.CompanyID == companyID 
       where j.RRDD == RRDD 
       select u).Distinct(); 

回答

1

我覺得你的SQL查詢的翻譯可能是:

var query=(from u in db.Users 
      from j in u.Journals 
      where j.CompanyID==p1 && j.RRDD==p2 && !(j.Frequency == "Ad hoc" && j.AdHocRecoMonth != p3) 
      select u).Disctinct(); 

p1p2p3是參數

另一種方式:

var query=db.Users.Where(u=> u.Journals.Any(j=>j.CompanyID==p1 
              && j.RRDD==p2 
              && !(j.Frequency == "Ad hoc" && j.AdHocRecoMonth != p3))); 
0

工作的呢?我不確定,因爲我無法測試它。收藏此下方的其他where S:

where ((j.Frequency == "Ad hoc" && j.AdHocRecoMonth <> "provided recomonth" ? "NO" : "YES") == "YES") 

這是基本上等同於您的IIF聲明the ternary operator一個例子。

注意:我不確定搜索字詞的大小寫是否重要,但它應該是您意識到的。舉例來說,如果j.Frequency等於"ad hoc"(全部小寫)會發生什麼......

0
var fUsers = (from u in db.Users from j in u.Journals 
       where j.CompanyID == companyID 
       and j.RRDD == RRDD 
       and ((j.Frequency == "Ad hoc" 
       and j.AdHocRecoMonth != {0} ? "NO" : "YES") == "YES") 
       select u).Distinct(); 

它會是這樣的。