2017-05-23 65 views
0

如何將IEnumerableNewUnitPhaseStatus作爲枚舉返回?將int轉換爲從sql查詢中枚舉C#實體框架

在SQL中,「NewUnitPhaseStatus」值存儲爲int。如果我只是返回查詢,那麼當我嘗試提取該值時,它只是表示DBcontext已被處置。但是,如果我嘗試將查詢結果轉換爲列表,則說明int不能轉換爲類型NewUnitPhaseStatus(枚舉類型)。

public IEnumerable<UnitPhaseLog> GetAllForUnitPhase(long unitPhaseId) 
{ 
    using (var db = new DbContext(_connStringKey)) 
    { 
     var querys = from s in db.UnitPhaseLogs 
         where s.UnitPhaseId == unitPhaseId 
         select s; 

      return querys; 
    } 
} 

若用foreach語句到每一行轉換成一個枚舉,他們得到一個錯誤,因爲VAR查詢類UnitPhaseLog與NewUnitPhaseStatus等於枚舉。

錯誤消息:

如果一個嘗試的結果轉換到一個列表。

'UnitPhaseLog'上的'NewUnitPhaseStatus'屬性無法設置爲'System.Int64'值。您必須將此屬性設置爲「Core.UnitPhaseStatus」類型的非空值。

如果試圖向剛剛返回查詢結果本身:

的操作,因爲的DbContext已經佈置無法完成。

代碼:

public enum UnitPhaseStatus 
{ 
    [Display(Name = "No Status")] 
    NoStatus, 
    [Display(Name = "Not Ready")] 
    NotReady, 
    [Display(Name = "Materials Needed")] 
    MaterialsNeeded, 
    [Display(Name = "Ready For Work")] 
    ReadyForWork, 
    [Display(Name = "Work In Progress")] 
    WorkInProgress, 
    [Display(Name = "Ready")] 
    ReadyForQc, 
    [Display(Name = "Approved")] 
    Approved, 
    [Display(Name = "Rejected")] 
    Rejected, 
} 
+1

你在說這句話嗎? 'UnitPhaseStatus UnitPhaseStatus = query.NewUnitPhaseStatus;' – DigiFriend

+0

因此在SQL中,該值存儲爲int。我試圖將它作爲class的枚舉返回UnitPhaseStatus – Ophiucus

+1

請顯示定義UnitPhaseStatus的代碼。 您的枚舉值應與SQL定義匹配。 – Bestter

回答

2

你需要從數據庫將返回值轉換爲枚舉類型。

unit.NewUnitPhaseStatus = (UnitPhaseStatus)UnitPhaseStatus; 

雖然,你可以直接這樣做,而不必去通過一個額外的局部變量。

因此,而不是:

UnitPhaseStatus UnitPhaseStatus = query.NewUnitPhaseStatus; 
unit.NewUnitPhaseStatus = UnitPhaseStatus; 

您可以使用:

unit.NewUnitPhaseStatus = (UnitPhaseStatus)query.NewUnitPhaseStatus; 
+0

代碼在foreach語句中斷,因爲var查詢的類型爲NewUnitPhaseStatus,這是一個enum – Ophiucus

+2

我不認爲你遵循。好。什麼類型是'UnitPhaseLog.NewUnitPhaseStatus'?什麼類型是'query.NewUnitPhaseStatus'(不是名稱 - 類型)?類型需要匹配。如果他們不這樣做,你需要投。 – DigiFriend

1

這是假設你正在使用實體框架,所以如果你不這樣做可以隨意忽略。

更好的解決方案可能是更改實體以將該列直接綁定到枚舉並讓框架爲您執行轉換,而不用擔心將Int轉換爲枚舉或將枚舉轉換爲Int。

+0

但是,你如何查詢結果? – Ophiucus

+0

如果您解決了您遇到的轉換錯誤,則應該能夠將結果作爲列表獲取。 –

1

沒有必要爲你弄亂foreach循環 - 你querys已經是正確的類型,所以如果不是null,剛剛返回。

public IEnumerable<UnitPhaseLog> GetAllForUnitPhase(long unitPhaseId) 
{ 
    using (var db = new DbContext(_connStringKey)) 
    { 
     var querys = from s in db.UnitPhaseLogs where s.UnitPhaseId == unitPhaseId select s; 

     List<UnitPhaseLog> UnitPhaseLogList = new List<UnitPhaseLog>(); 
     if (null == querys) return UnitPhaseLogList; 

     return querys; 
    } 
} 
+0

'UnitPhaseLog'上的'NewUnitPhaseStatus'屬性無法設置爲'System.Int64'值。您必須將此屬性設置爲「Core.UnitPhaseStatus」類型的非空值。 – Ophiucus

+1

這表明你的'UnitPhaseLog.NewUnitPhaseStatus'是一個'long',當它真的應該是一個'Core.UnitPhaseStatus'。這可能是你所有問題都來自哪裏。 – DigiFriend

+0

這是一個UnitPhaseStatus。我注意到,如果我在檢索數據之前沒有將IEnumerable變成列表,那麼它說數據已經被處置。 – Ophiucus