如何处理Nullable<;T>;从存储过程返回的类型

本文关键字:gt 存储过程 类型 返回 lt 何处理 处理 Nullable | 更新日期: 2023-09-27 18:19:51

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

请考虑以下情况和限制:

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

请分享您对处理类似情况的看法或经验。

谢谢你的关心。

如何处理Nullable<;T>;从存储过程返回的类型

最佳解决方案:

  • 不允许SQL返回NULL值。

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

下一个最佳解决方案:

  • 覆盖LINQToSQL对象get调用以检查对象是否有HasValue,如果没有,则将其设置为字段的default(type)

没有办法不检查每个值。

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

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

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

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

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

顺便说一句,从数据库中获取数百万行肯定会对某个地方产生明显的影响。你通常必须决定在哪里/什么时候疼痛会减轻!