SPMETAL / LINQ to SharePoint十进制类型

时间:2013-06-12 22:43:18

标签: linq sharepoint linq-to-sharepoint spmetal

我已经通过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 个答案:

答案 0 :(得分:1)

有几种情况,SPMetal会为您提供笨重的代码。你可以,有时必须解决这个问题。而且我承认,从源头上做这件事肯定会感觉更好。 但是有一个缺点。

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

如果你可以在对象/方法周围编写一个包装器,那么在端点转换类型当然更可取,但这是一般的良好编程实践。

答案 1 :(得分:0)

4.51E-05实际上等于0.0000451,因此您的代码没有任何问题。

换句话说,4.51E-05表示4.51乘以10到负5的幂,或0.0000451