2014-08-29 58 views
0

我試圖編寫一個使用if語句的linq查詢。在Linq查詢中使用條件if語句

在下面的代碼我在尋找

n.SAU_ID = sau.SAUID其中

ReportingPeriod列的比賽中包含 「OCT1」 然後 FiscalYear - aprYearDiff = sau.SAUYearCode。

否則

FiscalYear - octYearDiff = sau.SAUYearCode。

我的代碼只給出SAUID和「Oct1」的匹配。

需要什麼代碼來實現這些語句?

int FiscalYear = 2014;  

    List<String> addtowns = new List<string>(); 

    List<Stage_Reorg> reorg = _entities.Stage_Reorg.ToList(); 

    int aprYearDiff = 2; 
    int octYearDiff = 1; 

    foreach (var sau in reorg) 
    { 
     addtowns.AddRange(_entities.Stage_EPSSubsidySADCSDTown 
     .Where(n => n.SAU_ID == sau.SAUID 
      && (n.ReportingPeriod == "Oct1" 
      ? (FiscalYear - aprYearDiff) == sau.SAUYearCode 
      : (FiscalYear - octYearDiff) == sau.SAUYearCode)) 
     .Select(n => n.TownCode)); 
    } 
+0

您可以修復該語法,但我認爲它不適用於EF。 – 2014-08-29 18:24:05

+0

'.where(a => {/ * some code */return/* some bool value * /})' – RadioSpace 2014-08-29 18:26:19

+0

@EugenePodskal這實際上在編輯之前更容易閱讀。 – DCShannon 2014-08-29 18:32:33

回答

1

無論如何,這是一個壞主意。將條件轉換爲

(n.ReportingPeriod == "Oct1" && (FiscalYear - aprYearDiff) == sau.SAUYearCode) 
|| (n.ReportingPeriod != "Oct1" && (FiscalYear - octYearDiff) == sau.SAUYearCode) 
+0

可以詳細說明爲什麼它是一個壞主意,但無論如何upvoted,因爲這應該更好,並在邏輯上相當。 – DCShannon 2014-08-29 18:31:00

+0

由於聲明性代碼比命令性代碼好,而且這個更簡單。 – Stilgar 2014-08-29 18:32:56

+0

現在我認爲它在這種情況下是不正確的...... – Stilgar 2014-08-29 18:53:28

1

這是一種可能的方式,但這可能不適用於EF。您需要將所有記錄加載到內存中,然後執行過濾:

addtowns.AddRange(_entities.Stage_EPSSubsidySADCSDTown 
    .Where(n => { 
        bool b = n.ReportingPeriod == "Oct1" 
          ? (FiscalYear - aprYearDiff) == sau.SAUYearCode 
          : (FiscalYear - octYearDiff) == sau.SAUYearCode); 
        return b && n.SAU_ID == sau.SAUID; 
       }).Select(n => n.TownCode)) 
+0

我花了很長時間來打字。但我完全同意 – RadioSpace 2014-08-29 18:34:04