SPMETAL / LINQ to SharePoint Десятичные типы

Я натолкнулся на довольно серьезную проблему с сущностями, сгенерированными 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, например. Если я сделаю это, пример будет возвращать ожидаемый результат. Это кажется неуклюжим, хотя, и я хотел бы исправить это в источнике.

2 ответа

Есть несколько таких случаев, когда SPMetal даст вам неуклюжий код. Вы можете, а иногда и должны это исправить. И я признаю, что определенно лучше делать это у источника. Но есть и обратная сторона.

Когда ваша модель данных изменится, вам придется перезапустить SPMetal, чтобы включить новые объекты. Любые изменения, которые вы внесли в сгенерированный файл, должны быть тщательно задокументированы и пересмотрены, иначе ваш код будет поврежден. Поэтому я бы посоветовал оставить сгенерированный код в покое, если вы можете работать с ним.

Если вы можете написать обертку вокруг объектов / методов, конечно, было бы предпочтительнее, чем просто конвертировать типы в конечной точке, но в целом это хорошая практика программирования.

4.51E-05 на самом деле равен 0.0000451 так что с вашим кодом все в порядке.

Другими словами 4.51E-05 означает 4,51 умножить на десять к минус пять степеней, или 0.0000451

Другие вопросы по тегам