Linq 2 Sql实体中自动计算的属性?

时间:2009-10-10 07:39:05

标签: .net linq-to-sql

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

的OrderId 订购日期 CancelDate 发货日期 LastActionDate

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

2 个答案:

答案 0 :(得分:1)

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

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

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

因此,在您的情况下,您会找到OrderDateChanged()CancelDateChanged()ShipDateChanged()

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

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

   ......

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

}

马克

答案 1 :(得分:0)

如果您想要计算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关键字。