如何将EF属性转换为SQL Server';s计算列

本文关键字:计算 Server SQL EF 属性 转换 | 更新日期: 2023-09-27 18:24:08

我想将这些实体框架的属性转换为SQL Server的计算列。有可能吗?指定的所有其他属性都是表字段。此外,考虑到我使用的是Code First,我应该如何在模型中指定计算列?

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;
       }
   }

非常感谢!

如何将EF属性转换为SQL Server';s计算列

主要问题的答案是肯定的,这些C#例程可以转换为计算列。但有一个条件:计算结果所需的相关信息必须在表本身中找到。

对于您的Alert属性,以下是您的计算列的样子:

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计算列。在完成模型的第一次生成后,在DB中写入计算列,然后返回并将其连接到EF对象中。