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