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