2013-06-12 51 views
0

我碰到了一個相當重要的障礙,由spmetal/linq生成的實體共享點。我希望以前有人處理過這個問題..也許我錯過了一些明顯的東西。SPMETAL/LINQ到SharePoint十進制類型

比方說,我們有一個數字字段列表。預計該字段將保持合理的精確值。例如,0.0000451。一旦該值在列表中 - SharePoint就可以了。它顯示在列表中並正確顯示/編輯視圖。

現在,如果我們根據這個名單與spmetal上產生的實體,我們將獲得..

//... 
private System.Nullable<double> _number; 
//.. 
[Microsoft.SharePoint.Linq.ColumnAttribute(Name="Number", Storage="_number", Required=true, FieldType="Number")] 
public System.Nullable<double> Number { 
    get { 
     return this._number; 
    } 
    set { 
     if ((value != this._number)) 
     { 
      this.OnPropertyChanging("Number", this._number); 
      this._number= value; 
      this.OnPropertyChanged("Number"); 
     } 
    } 
} 
//... 

因爲由spmetal確定的類型是double試圖找回它,當我們得到的符號。例如:

var number = (from x in myDc.MyList select x.Number).First(); 

數字實際上會導致雙倍的4.51E-05而不是0.0000451

我假設這可以通過使用小數來解決。如果我將整個生成的實體的類型更改爲System.Nullable<decimal>,則會發生類型轉換失敗。

我該如何解決這個問題?

編輯我想也許最好是問「我應該如何處理這個」?例如,我可以簡單地將我的雙精度值轉換爲小數點後的值,例如,我的linq查詢。如果我這樣做,示例情況會返回預期結果。不過,這看起來很笨重,我想從源頭上糾正這一點。

回答

0

4.51E-05實際上等於0.0000451所以你的代碼沒有問題。

換句話說4.51E-05意味着4.51倍十負五大電力或0.0000451

+0

不,我明白了。我想弄清楚的是如何在處理數字時正確顯示它。 – mikeds

1

有幾個類似案例,其中SPMetal會給你笨重的代碼。你可以,有時也必須解決這個問題。我承認,從源頭上做它肯定會更好。 但有一個缺點。

當您的數據模型發生變化時,您將不得不重新運行SPMetal以合併您的新實體。您對生成的文件所做的任何更改都必須仔細記錄並重新完成,否則您的代碼將被破壞。因此,如果您可以使用它,我建議將生成的代碼單獨保留。

如果你可以在對象/方法中編寫一個包裝器,那麼當然最好是在終點處轉換類型,但這是一般的良好編程習慣。