微軟現在雖然主推EF(Entity Framework)了,但也提供了Linq to EF的實現,Linq在微軟的框架中還是一個比較強大的實現。曾經的Linq to SQL由於僅提供了SQL Server的OR實現,受到廣大的詬病。後來開源社區也提供了Linq to XXX,來支持各種數據的Linq實現。
今天討論的是ColumnAttribute中的Expression屬性,開始我創建好表,在某一個列的ColumnAttribute中添加Expression,讓它在原有值上加1,發現最終的結果並沒有實現值加1。
通過仔細查看官方文檔,發現Expression屬性僅在創建數據庫時生效,也就是說這個屬性會創建一個新的計算列,如果按照官方的例子,在UnitPrice上執行加1是不能成功的,這相當於有一個例是UnitPrice,還要創建一個計算列是UnitPrice+1,列名還為UnitPrice。這就違反數據庫創建表的列名必須唯一的原則。
所以真正有效的例子如下:
[global::System.Data.Linq.Mapping.ColumnAttribute(Storage = "_UnitPrice", DbType = "Money")]
public System.Nullable<decimal> UnitPrice
{
get
{
return this._UnitPrice;
}
set
{
if ((this._UnitPrice != value))
{
this.OnUnitPriceChanging(value);
this.SendPropertyChanging();
this._UnitPrice = value;
this.SendPropertyChanged("UnitPrice");
this.OnUnitPriceChanged();
}
}
}
[Column(Storage = "_NewUnitPrice", DbType = "Money", Expression = "UnitPrice + 2.00")]
public decimal? NewUnitPrice
{
get { return _NewUnitPrice; }
set { _NewUnitPrice = value; }
}
其中的NewUnitPrice是我們要創建的新單價的計算列。然後在使用時如果數據庫存在先刪除,再創建,代碼如下:
ProductClassDataContext pcdc = new ProductClassDataContext(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=D:\demo.mdf;Integrated Security=True;Connect Timeout=30");
if (pcdc.DatabaseExists())
{
pcdc.DeleteDatabase();
}
pcdc.CreateDatabase();
當然刪除操作完善點應該是在首次運行時。否則每次都刪除的話原來的數據都沒有了。
當創建好數據庫後,使用VS查看錶,發現NewUnitPrice的圖標都是計算列圖標。如下圖: