0

我正在寻找一些关于最佳实践(考虑内存和 CPU 时间)的建议,以处理Nullable<T>从使用 Linq2Sql 的存储过程返回的字段。

请考虑以下场景和限制:

  1. 我想避免在代码中的任何地方使用 fieldValue.HasValue 检查。因此,我需要Nullable<T>用一些默认值替换所有普通属性(尤其是 DateTime、Double、Int)。
  2. 我期待读取约 100 万个对象,其中有约 20 个可为 Nullable 类型的字段。
  3. 内存和 CPU 使用率是一个重要的考虑因素。
  4. 要求是从对象(不是 DataRow)中的存储过程中获取结果,从而使用 Linq2Sql。

请分享您处理类似情况的意见或经验。

感谢您的关注。

4

3 回答 3

2

最佳解决方案:

  • 不允许 SQL 返回 NULL 值。

  • 最简单的方法是不允许列本身为空,但如果不可能,那么您可以在用于返回数据的查询中执行 ISNULL(field, defaultvalue)。

下一个最佳解决方案:

  • 覆盖 LINQToSQL 对象获取调用以检查对象是否 HasValue,然后如果没有将其设置default(type)为字段的值。

没有办法不检查每个值。

于 2012-01-10T15:59:10.030 回答
1

您可以编写扩展方法,例如:

public static string SafeGetString(this SqlDataReader _Reader, int _ColIndex)
{
    if (_Reader.IsDBNull(_ColIndex))
        return null; //Default value
    else
        return _Reader.GetString(_ColIndex);
}

对于使用的每种类型(实际上没有那么多),将默认值设置为其他值,而不是null将数据插入到不可为空的类型中。

于 2012-01-10T15:46:40.633 回答
0

一个核心选​​项是在源头合并这些值。您将保证 null 将远离数据读取器。

但由于性能似乎是一个大问题,我建议您在损害代码的健全性(过度优化)或运行时的健全性(滥用内存或 cpu)之前衡量不同的选项以做出明智的决定。

作为旁注,从数据库中获取数百万行肯定会在某处产生明显的影响。您通常必须决定在何处/何时会减少伤害!

于 2012-01-10T16:02:14.680 回答