您的位置:首页 > 其它

又学一招—— Nullable<T>比较

2015-12-30 09:49 330 查看
问题是这样 :

数据库中有一个字段是GUID类型的,而且允许为空。
通过ORM映射成的实体中该字段就是GUID?类型的,也就是本文所说的Nullable类型
然后功能需求是:要与数据库中该字段进行比较,传进看参数是GUID类型

错误就发生了:



然后我们来了解一下nullable类型

[Serializable]
[TypeDependency("System.Collections.Generic.NullableComparer`1")]
[TypeDependency("System.Collections.Generic.NullableEqualityComparer`1")]
public struct Nullable<T> where T : struct
{
//
// 摘要:
//     将 System.Nullable<T> 结构的新实例初始化为指定值。
//
// 参数:
//   value:
//     一个值类型。
[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
public Nullable(T value);

public static explicit operator T(Nullable<T> value);
public static implicit operator Nullable<T>(T value);

// 摘要:
//     获取一个值,指示当前的 System.Nullable<T> 对象是否有值。
//
// 返回结果:
//     如果当前的 System.Nullable<T> 对象具有值,则为 true;如果当前的 System.Nullable<T> 对象没有值,则为
//     false。
public bool HasValue { get; }
//
// 摘要:
//     获取当前的 System.Nullable<T> 值。
//
// 返回结果:
//     如果 System.Nullable<T>.HasValue 属性为 true,则为当前 System.Nullable<T> 对象的值。如果 System.Nullable<T>.HasValue
//     属性为 false,则将引发异常。
//
// 异常:
//   System.InvalidOperationException:
//     System.Nullable<T>.HasValue 属性为 false。
public T Value { get; }

// 摘要:
//     Indicates whether the current System.Nullable<T> object is equal to a specified
//     object.
//
// 参数:
//   other:
//     一个对象。
//
// 返回结果:
//     如果 other 等于当前的 System.Nullable<T> 对象,则为 true;否则为 false。此表描述如何定义所比较值的相等性:返回值说明trueSystem.Nullable<T>.HasValue
//     属性为 false,并且 other 参数为 null。即,根据定义,两个 null 值相等。- 或 -System.Nullable<T>.HasValue
//     属性为 true,并且 System.Nullable<T>.Value 属性返回的值等于 other 参数。false当前 System.Nullable<T>
//     结构的 System.Nullable<T>.HasValue 属性为 true,并且 other 参数为 null。- 或 -当前 System.Nullable<T>
//     结构的 System.Nullable<T>.HasValue 属性为 false,并且 other 参数不为 null。- 或 -当前 System.Nullable<T>
//     结构的 System.Nullable<T>.HasValue 属性为 true,并且 System.Nullable<T>.Value 属性返回的值不等于
//     other 参数。
public override bool Equals(object other);
//
// 摘要:
//     检索由 System.Nullable<T>.Value 属性返回的对象的哈希代码。
//
// 返回结果:
//     如果 System.Nullable<T>.HasValue 属性为 true,则为 System.Nullable<T>.Value 属性返回的对象的哈希代码;如果
//     System.Nullable<T>.HasValue 属性为 false,则为零。
public override int GetHashCode();
//
// 摘要:
//     检索当前 System.Nullable<T> 对象的值,或该对象的默认值。
//
// 返回结果:
//     如果 System.Nullable<T>.HasValue 属性为 true,则为 System.Nullable<T>.Value 属性的值;否则为当前
//     System.Nullable<T> 对象的默认值。默认值的类型为当前 System.Nullable<T> 对象的类型参数,而默认值的值中只包含二进制零。
[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
public T GetValueOrDefault();
//
// 摘要:
//     检索当前 System.Nullable<T> 对象的值或指定的默认值。
//
// 参数:
//   defaultValue:
//     如果 System.Nullable<T>.HasValue 属性为 false,则为一个返回值。
//
// 返回结果:
//     如果 System.Nullable<T>.HasValue 属性为 true,则为 System.Nullable<T>.Value 属性的值;否则为
//     defaultValue 参数。
public T GetValueOrDefault(T defaultValue);
//
// 摘要:
//     返回当前 System.Nullable<T> 对象的值的文本表示形式。
//
// 返回结果:
//     如果 System.Nullable<T>.HasValue 属性为 true,则是当前 System.Nullable<T> 对象的值的文本表示形式;如果
//     System.Nullable<T>.HasValue 属性为 false,则是一个空字符串 ("")。
public override string ToString();
}


于是修改代码如下

public List<BO_BaseInfo> GetByBot(string botName, string pid)
{
var list = new List<BO_BaseInfo>();
if (string.IsNullOrEmpty(pid) || pid == "null")
{
list =
_dbContext.BO_BaseInfo.Include("BO_BOAlias").Where(w => w.BOT.Equals(botName) && !w.PID.HasValue)
.OrderBy(o => o.OrderIndex)
.ThenBy(t => t.CreatedDate)
.ToList();
}
else
{
var pId = Guid.Parse(pid);
//先获得所有存在pid的数据,因为当guid?值为空的时候,获得其value值会抛出异常
var query = _dbContext.BO_BaseInfo.Include("BO_BOAlias").Where(w => w.BOT.Equals(botName) && w.PID.HasValue);
list = query.Where(w => w.PID.Value.Equals(pId))
.OrderBy(o => o.OrderIndex)
.ThenBy(t => t.CreatedDate)
.ToList();
}
return list;
}


其中的PID是guid?的类型

问题终于得到解决,以后再深深体会nullable类型的数据处理的不同吧
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: