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();

number 实际上会导致 的两倍4.51E-05,而不是0.0000451

我假设这可以通过使用小数来解决。如果我将生成的实体中的类型更改为System.Nullable<decimal>类型转换失败。

我应该如何解决这个问题?

编辑我认为也许最好问“我应该如何处理这个”?例如,我可以稍后将我的双精度值简单地转换为十进制......例如,我的 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 的负五次方,或0.0000451

于 2013-06-13T05:35:00.450 回答