问题是这样 :
- 数据库中有一个字段是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类型的数据处理的不同吧