.net 在Linq 2 Sql实体中自动计算属性?

.net 在Linq 2 Sql实体中自动计算属性?,.net,linq-to-sql,.net,Linq To Sql,假设我的数据库中有一个名为Orders的表,该表具有以下列: 医嘱ID 訂單日期 取消日期 交货日期 最后行动日期 我希望LastActionDate始终是OrderDate、CancelDate和ShipDate的最新日期。实现这一目标的最佳方式是什么?有没有办法处理这三个日期的OnChanged事件,以便在这些属性更改时可以重新计算LastActionDate?或者是否有一些内置的Linq 2 Sql魔法可以处理这种情况?或者,无论何时更改三个日期中的任何一个,我都必须确保设置LastAct

假设我的数据库中有一个名为Orders的表,该表具有以下列:

医嘱ID 訂單日期 取消日期 交货日期 最后行动日期


我希望LastActionDate始终是OrderDate、CancelDate和ShipDate的最新日期。实现这一目标的最佳方式是什么?有没有办法处理这三个日期的OnChanged事件,以便在这些属性更改时可以重新计算LastActionDate?或者是否有一些内置的Linq 2 Sql魔法可以处理这种情况?或者,无论何时更改三个日期中的任何一个,我都必须确保设置LastActionDate吗?

如果要计算LastActionDate,则不应将其作为数据库中的列

假设该列不在数据库中,它也不应该是自动生成的L2S代码的一部分。这很好,因为这意味着您可以自己添加它,因为自动生成的L2S类是分部类

添加一个新的C#代码文件,声明与自动生成的Order类签名完全相同的Order类,并添加计算属性。大概是这样的:

public partial class Order
{
    public DateTime LastActionDate
    {
        get
        {
            // pick the desired value from the other
            // three properties and return it
        }
    }
}

请注意类声明中的
partial
关键字。

在Linq-to-SQL模型中,每个实体的每个属性都有一个名为“(propertyname)Changed()”的分部方法

部分方法是C#3.0的一个新特性-它们是定义的方法,但不一定有实际的实现。如果它们没有实现,对它们的任何调用都将在构建过程的链接阶段被剥离

但是,如果您确实提供了一个实现,那么该实现实际上就是调用。由于
Order
等实体类是分部类,因此可以轻松创建自己的附加分部类并定义这些方法

因此,在您的例子中,您会发现
OrderDateChanged()
CancelDateChanged()
ShipDateChanged()

通过这些方法,您可以很容易地调用名为
calculateLasActionDate()
的方法,根据需要计算新日期。应该相当容易

public partial class Order
{
   void OrderDateChanged()
   {
       CalculateLastActionDate();
   }

   ......

   private void CalculateLastActionDate()
   {
      ... your implementation here
   }

}

Marc

理论上这很好,但在某些情况下,这些自动计算的值很有用(例如,用于计算订单小计,或者如果计算非常密集,不适合实时计算)。那你怎么办?我不确定我是否理解这个问题。如果需要一个非规范化字段,L2S只需将其视为任何其他字段。OTOH,如果您仍然希望在客户机上计算它,您仍然可以使用分部类方法,但在完成一次计算后,将计算结果缓存为类中的字段。很好的解决方案!!。我在生成一个linq查询时遇到了一个问题,该查询在“where”子句中有这个新的计算属性(linq 2 entities,它会引发一个异常),您知道有没有一种好方法可以在编译时检查它吗?谢谢