如何处理从存储过程返回的Nullable <t>类型?</t>

时间:2012-01-10 15:44:34

标签: c# linq-to-sql nullable cpu-usage memory-profiling

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

请考虑以下方案和限制:

  1. 我想避免在代码中的任何地方使用fieldValue.HasValue检查。因此,我需要用普通属性(esp DateTime,Double,Int)替换所有Nullable<T>一些默认值。
  2. 我希望用~20个Nullable类型的字段读取约100万个对象。
  3. 内存和CPU使用率是一个重要的考虑因素。
  4. 要求是从对象(而不是DataRow)中获取存储过程的结果,从而使用Linq2Sql。
  5. 请分享您对处理类似情况的意见或经验。

    感谢您的关注。

3 个答案:

答案 0 :(得分:2)

最佳解决方案:

  • 不允许SQL返回NULL值。

  • 执行此操作的最简单方法是不允许列本身为null,但如果不可能,则可以在您使用的查询中执行ISNULL(字段,默认值)返回数据。

下一个最佳解决方案:

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

没有办法不检查每个值。

答案 1 :(得分:1)

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

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

对于使用的每种类型(实际上没有那么多),如果要将数据插入到非可空类型中,请将默认值设置为null以外的其他值。

答案 2 :(得分:0)

硬核选项是在源头合并值。您将保证空值远离数据读取器。

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

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

相关问题