如何处理Nullable<;T>;从存储过程返回的类型
本文关键字:gt 存储过程 类型 返回 lt 何处理 处理 Nullable | 更新日期: 2023-09-27 18:19:51
我正在寻找一些关于使用Linq2Sql处理存储过程返回的Nullable<T>
字段的最佳实践(考虑内存和CPU时间)的建议。
请考虑以下情况和限制:
- 我想避免在代码中到处使用fieldValue.HasValue检查。因此,我需要用一些默认值的普通属性(特别是DateTime、Double、Int)替换所有
Nullable<T>
- 我预计将读取约100万个具有约20个Nullable类型字段的对象
- 内存和CPU的使用是一个重要的考虑因素
- 要求是从对象(而不是DataRow)中的存储过程中获取结果,从而使用Linq2Sql
请分享您对处理类似情况的看法或经验。
谢谢你的关心。
最佳解决方案:
-
不允许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)之前,衡量不同的选项,以做出明智的决定。
顺便说一句,从数据库中获取数百万行肯定会对某个地方产生明显的影响。你通常必须决定在哪里/什么时候疼痛会减轻!