2009-10-10 80 views
2

比方说,我有我的数据库名为订单的表中有以下栏目:Linq 2 Sql实体中自动计算的属性?

的OrderId 订购日期 CancelDate 并按ShipDate LastActionDate

我想LastActionDate永远是订购日期,CancelDate的最新日期,和ShipDate。什么是实现这一目标的最佳方式?有没有办法处理这三个日期的OnChanged事件,以便LastActionDate可以在这些属性更改时重新计算?还是有一些内置的Linq 2 Sql魔术可以处理这种情况?或者,只要我更改三个日期中的任何一个,就必须确保设置LastActionDate?

回答

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 
    } 

} 

马克

+0

不错的解决方案!!我有一个问题产生一个linq查询,在'where'子句中有这个新的计算属性(linq 2个实体,它引发一个异常),你知道在编译时是否有一个好方法来检查吗?谢谢 – tivo 2011-03-17 17:19:53

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关键字。

+0

这在理论上是不错的,但有些情况下,这些自动计算值派上用场(如订单,例如分类汇总计算的情况下,或者如果计算是相当激烈的,不适合即时计算)。那你怎么办呢? – 2009-10-10 08:39:23

+0

然后,我不确定我是否理解这个问题。如果非规范化的字段是必要的,它将被L2S视为任何其他字段。 OTOH,如果您仍然希望在客户端计算它,您仍可以使用分部类方法,但是在完成一次计算后,将计算结果缓存为类中的字段。 – 2009-10-10 09:07:11