0

spmetal / linq to 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-05number は、実際にはではなくの double になり0.0000451ます。

これは、小数を使用して修正できると想定しています。生成されたエンティティ全体で型を変更するSystem.Nullable<decimal>と、型変換エラーが発生します。

これを修正するにはどうすればよいですか?

編集「これにどう対処すればよいか」と尋ねるほうがよいのではないでしょうか。たとえば、後で double 値を 10 進数に単純に変換できます。たとえば、私の linq クエリです。そうすれば、例のケースは期待される結果を返します。しかし、それは不格好に思えます。ソースでこれを修正したいと思います。

4

2 に答える 2

1

このように、SPMetal から不格好なコードが返されるケースがいくつかあります。あなたはそれを修正することができ、時には修正しなければなりません。そして、ソースでそれを行う方が間違いなく気分が良いことは認めます. しかし、欠点があります。

データ モデルが変更されたら、SPMetal を再実行して新しいエンティティを組み込む必要があります。生成されたファイルに加えた変更は、慎重に文書化してやり直す必要があります。そうしないと、コードが壊れてしまいます。したがって、作業できる場合は、生成されたコードをそのままにしておくことをお勧めします。

オブジェクト/メソッドの周りにラッパーを記述できる場合は、もちろん、エンドポイントで型を変換するだけの方が望ましいですが、それは一般的な優れたプログラミング手法です。

于 2013-06-14T07:57:27.703 に答える
0

4.51E-05実際には等しい0.0000451ので、コードに問題はありません。

つまり4.51E-05、4.51 かける 10 のマイナス 5 乗、または0.0000451

于 2013-06-13T05:35:00.450 に答える