代码之家  ›  专栏  ›  技术社区  ›  Kevin Pang

是否在Linq2 SQL实体中自动计算属性?

  •  2
  • Kevin Pang  · 技术社区  · 15 年前

    假设我的数据库中有一个名为ORDERS的表,它有以下列:

    有序的 訂單日期 取消日期 发货日期 持续活动日期

    我希望LastActionDate始终是订单日期、取消日期和发货日期的最新日期。最好的方法是什么?是否有方法处理这三个日期的onchanged事件,以便在这些属性发生更改时重新计算LastActionDate?或者,是否有一些内置的Linq2 SQL魔力来处理这个场景?或者,当我更改这三个日期中的任何一个时,我需要确保设置LastActionDate吗?

    2 回复  |  直到 15 年前
        1
  •  1
  •   marc_s    15 年前

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

    马克

        2
  •  0
  •   Mark Seemann    15 年前

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

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

    添加一个新的C代码文件,并用与自动生成的订单类完全相同的签名声明订单类,然后添加计算属性。像这样:

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

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