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

问题是这样 :

  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类型的数据处理的不同吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值