3

我想將這些實體框架的屬性轉換爲SQL Server的計算列。可能嗎?指定的所有其他屬性都是表字段。 此外,考慮到我使用Code First,我應該如何在模型中指定計算列?如何將EF屬性轉換爲SQL Server的計算列?

public enum Severity : int { INTIME = 0, B = 1, M = 2, A = 3, TIMEOUT = 4 }; 
public enum StatiTT : int { ND_INT = 1, ND_REP = 2, INT = 3, DI = 4, CH = 5, RV = 6, AN = 7 }; 
private const float TRESH_B = (float)0.5; 
private const float TRESH_M = (float)0.3; 
private const float TRESH_A = (float)0.2; 

A)

public int MinutiAllaScadenza 
    { 
     get 
     { 
      int mm = 0; 
      DateTime Ora = DateTime.Now; 

      mm = (DataObiettivo - Ora).Days*1440 + (DataObiettivo - Ora).Hours * 60 + (DataObiettivo - Ora).Minutes; 

      if (StatoTicketID > (int)StatiTT.DI && mm < 0) mm = 10000000; 

      return mm; 
     } 
    } 

B)

public int Sev 
    { 
     get 
     { 
      int sev = 0; 
      float perctres = PercentualeTempoResiduo; 

      if (StatoTicketID < (int)StatiTT.CH) 
      { 
       if (MinutiAllaScadenza < 0) { sev = (int)Severity.TIMEOUT; return sev; } 
       if (perctres < TRESH_A) { sev = (int)Severity.A; return sev; } 
       if (perctres < TRESH_M) { sev = (int)Severity.M; return sev; } 
       if (perctres < TRESH_B) { sev = (int)Severity.B; return sev; } 
      } 
      return sev; 
     } 
    } 

C)

public float PercentualeTempoResiduo 
    { 
     get 
     { 

      if (StatoTicketID > (int)StatiTT.DI) return 999; 

      float perc = 0; 
      float mm2scad = (float)MinutiAllaScadenza; 
      float mmtot = (float)TempoTotaleInizio_Obiettivo; 

      if (MinutiAllaScadenza > 0) 

       perc = (float)1 - (mmtot-mm2scad)/mmtot; 

      return perc; 
     } 
    } 

d)

public string Alert 
    { 
     get 
     { 
      string alert = ""; 
      float perctres = PercentualeTempoResiduo; 

      if (StatoTicketID < (int)StatiTT.CH) { 
       if (perctres < TRESH_A) { alert = "A"; return alert; } 
       if (perctres < TRESH_M) { alert = "M"; return alert; } 
       if (perctres < TRESH_B) { alert = "B"; return alert; } 
      } 
      return alert; 
     } 
    } 

非常感謝!

回答

1

您的主要問題的答案是肯定的,這些C#例程可以轉換爲計算列。但是有一個條件:計算結果所需的相關信息必須在表中找到。

快訊的財產,這是你的計算列是什麼樣子:

alter table <TBLNAME> add <COLNAME> AS (
    case 
    when StatoTicketID < (int)StatiTT.CH AND perctres < .2 then 'A' 
    when StatoTicketID < (int)StatiTT.CH AND perctres < .3 then 'M' 
    when StatoTicketID < (int)StatiTT.CH AND perctres < .5 then 'B' 
    else '' 
    end) 

如果你的計算結果需要從其他表然後再考慮結合EF來閱讀一個視圖中使用的信息,然後使用普通的EF對象爲您的寫作業務。

至於代碼優先,您不能在C#中編寫計算列,並期望EF將它轉換爲SQLServer計算列。在完成模型第一次生成之後,將計算列寫入數據庫,然後返回並將其連接到EF對象。

+0

非常感謝@sisdog寶貴的答案! 不幸的是,我真的是一個初學者,現在我開始發現SQL Server的潛力。您是否可以轉碼其他屬性,或者告訴我處理日期的文檔在哪裏?我認爲你的答案對於像我這樣的初學者很有價值。 此外,應該可以根據其他計算得出計算列嗎?我應該使用PERSISTENT子句嗎? 非常感謝您!來自意大利 – Larry 2012-02-13 08:32:23

+0

我試圖讓我的問題裏描述的所有屬性的計算列 問候......問題是,它是不可能基於其他計算...所以我找到了最好的方法是創建計算列創建幾個函數並在不同的計算列中使用它們......有人可以讓我創建一個例子來在問題中創建「** C **」屬性的函數,或者建議我使用更好的方法嗎?謝謝! – Larry 2012-02-13 15:48:51

+0

我成功地將它與計算列結合起來。謝謝@sisdog您寶貴的信息! – Larry 2012-02-13 21:44:16