SPMETAL / LINQ到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的double,而不是0.0000451

我假设这可以通过使用小数来修复。如果我将整个生成实体的类型更改为System.Nullable<decimal>,则会出现类型转换失败。

我该如何解决这个问题?

EDIT我想也许最好问"我应该如何处理这个"?例如,我可以简单地将双精度值转换成十进制值。例如,我的linq查询。如果这样做,示例情况将返回预期的结果。虽然这看起来很笨拙,但我想在源代码上纠正这一点。

在这种情况下,SPMetal会给您提供笨拙的代码。你可以,有时也必须解决这个问题。我承认,从源头开始做肯定感觉更好。但也有不利的一面。

当您的数据模型更改时,您将不得不重新运行SPMetal以合并您的新实体。您对生成的文件所做的任何更改都必须仔细记录并重新完成,否则您的代码将被破坏。因此,如果您可以使用生成的代码,我建议不要使用它。

如果您可以为对象/方法编写一个包装器,当然最好是在结束时转换类型,但这通常是良好的编程实践。

4.51E-05实际上等于0.0000451,所以你的代码没有问题。

换句话说,4.51E-05表示4.51乘以10的- 5次方,或者0.0000451

相关内容

  • 没有找到相关文章