又学一招—— Nullable<T>比较
2015-12-30 09:49
330 查看
问题是这样 :
数据库中有一个字段是GUID类型的,而且允许为空。
通过ORM映射成的实体中该字段就是GUID?类型的,也就是本文所说的Nullable类型
然后功能需求是:要与数据库中该字段进行比较,传进看参数是GUID类型
错误就发生了:
![](http://img.blog.csdn.net/20151230092557584?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
然后我们来了解一下nullable类型
于是修改代码如下
其中的PID是guid?的类型
问题终于得到解决,以后再深深体会nullable类型的数据处理的不同吧
数据库中有一个字段是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类型的数据处理的不同吧
相关文章推荐
- php文件上传大小限制的修改方法大全
- ThreadPoolExecutor使用介绍
- [ActionScript 3.0] AS 实现JSON转换为XML
- iOS app审核规则(官网)
- 如何写php守护进程(Daemon)
- c#老化测试程序
- 微信支付登录总结
- 0.00-050613_ZC_Chapter4_20151230
- 黑马程序员--OC自学笔记---08ARC、category、block
- apache 自带压力测试工具ab.exe的使用
- top.location.href和localtion.href有什么不同
- .ajax()方法参数详解
- sql 字段先计算后再拿比对的字段进行比对 效率提升100倍
- Mac下安装 PIL
- hdu5603 树状数组
- Linux 下软件安装
- iOS block3种传值方法
- Spring集成MyBatis
- qt button的位置和大小
- phonegap菜鸟入门小结