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

来源:互联网 发布:mac怎么设置ppt母版 编辑:程序博客网 时间:2024/06/17 13:33

问题是这样 :

  1. 数据库中有一个字段是GUID类型的,而且允许为空。
  2. 通过ORM映射成的实体中该字段就是GUID?类型的,也就是本文所说的Nullable类型
  3. 然后功能需求是:要与数据库中该字段进行比较,传进看参数是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类型的数据处理的不同吧

0 0