今天遇到一个问题,怎么在where里判断一个字段是否为null,并且这个字段不是字符串string类型,而是int和GUID类型,折腾了半天终于搞明白了。(由于项目是我半路接手的,问题是前期的同事给我挖了一个坑,我今天就是填坑的)

1.在说这个问题之前,我先说一下数据库的表与C#之间model的对应:

一般数据库中的表我们都可以使用代码生成器(东软代码生成器)生成,其中字段的可空不可空也会给我们生成,如:表

用代码生成器生成的model是:

/// <summary>
/// SettingConfiguration:实体类(属性说明自动提取数据库字段的描述信息)
/// </summary>
[Serializable]
public partial class SettingConfiguration
{
public SettingConfiguration()
{}
#region Model
private int _id;
private string _name;
private string _value;
private int? _parentid;
/// <summary>
///
/// </summary>
public int Id
{
set{ _id=value;}
get{return _id;}
}
/// <summary>
///
/// </summary>
public string Name
{
set{ _name=value;}
get{return _name;}
}
/// <summary>
///
/// </summary>
public string Value
{
set{ _value=value;}
get{return _value;}
}
/// <summary>
///
/// </summary>
public int? ParentId
{
set{ _parentid=value;}
get{return _parentid;}
}
#endregion Model }

数据库中我们可以看到ParentId这个字段是可以为空的,其他字段不能为空;

对应到代码生成器生成的代码Model就可以看到代码:

public int? ParentId

{
set{ _parentid=value;}
get{return _parentid;}
}

主要是int?

有些能不知道这个int?是什么意思?和int有什么区别?这里简单说一下两者之间的区别:int?是可以为null的,而int是不能赋值null的:如下面两个代码:

int? a = null; //编译成功
int a = null; //编译错误。
int?允许把null赋值给数值型,这个是为了兼容SQL或者其它数据库中Null这个空值所设定的。

所以:在把数据库的表转化成model时,一定要把可为空的字段转化成对应的可为空的C#字段:

主要有

int——>int?

Guid——>Guid?

DateTime——>DateTime?

short——>short?

decimal——>decimal?

注意:有人说string为什么不转化成string?  额额额额~~~~~你傻呀,string类型的字段本来就可以为null,何必要写出string?,多此一举。

通过上面的介绍,大家一定对数据库表转化成model有了一定的了解。那么我们就言归正传,说问题:

2.问题的根源

问题的根源就是同是在建model的时候,该转化的没转化,导致我查询一而再、再而三的失败。

对于可以为null的字段,如果要判断这个字段是不是null,比如我们在查询表SettingConfiguration中ParentId是null的数据,我们就可以这样写:

var dtvar = (from des in db.SettingConfiguration
                 where(des.ParentId==null)
      select des);

这样查询肯定没问题的,可以~~~~嘿嘿嘿嘿嘿嘿~~~

如果你在建model的时候ParentId的字段是

public int ParentId

{
set{ _parentid=value;}
get{return _parentid;}
}

这样写的,那你怎也查不到数据,并且还不会报错,让你郁闷终生(我就是这么郁闷的),郁闷郁闷,在网上找了很多方法,都不能查询出数据,

后来改了一下model之后,什么问题都解决了,这就是一个大坑,让我填平了,同时在提醒大家,建model一定要和数据库对应,要不然以后坑的都是自己。

下面提供一些很有用的查询null的方法:

LINQ TO SQL   Null 查询

方法一:

from o in Orders  where o.ShippedDate==null  select o

对应的Lamda表达式为:

Orders .Where (o => (o.ShippedDate == (DateTime?)null))

对应的SQL语句为:

方法二:

from o in Orders  where Nullable<DateTime>.Equals(o.ShippedDate,null)  select o

对应的Lamda表达式为:

Orders .Where (o => Object.Equals (o.ShippedDate, null))

对应的SQL语句为:

方法三:

from o in Orders  where !o.ShippedDate.HasValue  select o

对应的Lamda表达式为:

Orders .Where (o => !(o.ShippedDate.HasValue))

对应的SQL语句为:

方法四:

from o in Orders  where o.ShippedDate.Value==(DateTime?)null  select o

对应的Lamda表达式为:

Orders.Where (o => ((DateTime?)(o.ShippedDate.Value) == (DateTime?)null))

 对应的SQL语句为:

SELECT [t0].[OrderID], [t0].[CustomerID], [t0].[EmployeeID], [t0].[OrderDate], [t0].[RequiredDate], [t0].[ShippedDate], [t0].[ShipVia], [t0].[Freight], [t0].[ShipName], [t0].[ShipAddress], [t0].[ShipCity], [t0].[ShipRegion], [t0].[ShipPostalCode], [t0].[ShipCountry]  FROM [Orders] AS [t0]  WHERE ([t0].[ShippedDate]) IS NULL

方法五:

from o in Orders  where  System.Data.Linq.SqlClient.SqlMethods.Equals(o.ShippedDate.Value,null)  select o

对应的Lamda表达式为:

Orders .Where (o => Object.Equals (o.ShippedDate.Value, null))

对应的SQL语句为:

这五种方法,都是可以借鉴的。

Linq里where出现null的问题的更多相关文章

  1. linq查询数值为null的问题以及数据表的关联计算问题

    说明:下面实例都是我进行项目开发时的真实部分代码,毫无保留 一.数据表的关联计算 //把当前年度的分差计算出来,建立两个关联的数据表 try { using(TransactionScope scop ...

  2. Linq sum()时遇到NULL

    当使用linq求和sum()时,如果某列数据为null,就会出现异常 使用下面的语句即可解决相关问题: db.TableModel.Where(w => w.ID == ID).Select(s ...

  3. linq里的select和selectmany操作

    Select() 和 SelectMany() 的工作都是依据源值生成一个或多个结果值.Select() 为每个源值生成一个结果值.因此,总体结果是一个与源集合具有相同元素数目的集合.与之相反,Sel ...

  4. sql里条件is null 在thinkphp里

    $map['字段名'] = array('exp',' is NULL'); 譬如:$condition['url']  = array('exp',' is NULL');

  5. LINQ里的Distinct()

    IQueryable 继承自IEnumerable 先举例: #region linq to object List<People> peopleList = new List<Pe ...

  6. shell里的/dev/null 2>&1详解

    shell中可能经常能看到: >/dev/null 2>&1 命令意思是:标准输出stdout 和标准错误输出stderr 也重定向到空设备文件,即不显示输出信息 分解这个组合:“ ...

  7. linq里lambda写的join查询,并附加动态拼接的条件,条件为enum类型的查询

    因为查询条件不固定的原因,sql式的linq查询没法动态拼接条件. 网上搜的资料整理之后终于解决. 参考资料: enum使用 http://blog.csdn.net/slowlifes/articl ...

  8. linq里的select和selectmany操作 投影运算

    原文地址:https://msdn.microsoft.com/zh-cn/library/bb546168.aspx#Mtps_DropDownFilterText 投影运算   其他版本   投影 ...

  9. LINQ里的“equals”和“==”的区别

    对于值类型,如果对象的值相等,则相等运算符 (==) 返回 true,否则返回 false.对于string 以外的引用类型,如果两个对象引用同一个对象,则 == 返回 true.对于 string ...

随机推荐

  1. 北京Uber优步司机奖励政策(4月2日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  2. 成都Uber优步司机奖励政策(4月6日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  3. 机器学习的5种“兵法"

    大数据文摘作品,欢迎个人转发朋友圈,自媒体.媒体.机构转载务必申请授权,后台留言“机构名称+转载”,申请过授权的不必再次申请,只要按约定转载即可. 作者:Jason Brownlee 译者:Clair ...

  4. create-react-app react-redux项目 配置模块热更新hmr

    HRM并不是create-react-app专属的,提供一篇博客介绍hrm http://chrisshepherd.me/posts/adding-hot-module-reloading-to-c ...

  5. photoshop cc 2018安装破解教程(破解补丁,亲测,绝对可用)

    破解步骤说明:下载地址百度网盘,https://pan.baidu.com/s/1cWtpUesl2fms3tFwEC0MiQ 1.右键解压Adobe Photoshop CC 2018 64位这个文 ...

  6. Matlab2018年最新视频教程视频讲义(包含代码)

    2018年Matlab最新视频教程视频讲义(包含代码),适合初学者入门进阶学习,下载地址:百度网盘, https://pan.baidu.com/s/1w4h297ua6ctzfturQ1791g 内 ...

  7. 网站端测试常见BUG

    1.翻页 翻页时,没有加载数据为空,第二页数据没有请求 翻页时,重复请求第一页的数据 翻页时,没有图片的内容有时候会引用有图片的内容 2.图片数据为空 图片数据为空时,会保留为空的图片数据位置 3.链 ...

  8. MongoDB->NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL"

    关系型数据库遵循ACID规则 事务在英文中是transaction,和现实世界中的交易很类似,它有如下四个特性: 1.A (Atomicity) 原子性 原子性很容易理解,也就是说事务里的所有操作要么 ...

  9. Java进阶知识点:服务端高并发的基石 - NIO与Reactor AIO与Proactor

    一.背景 要提升服务器的并发处理能力,通常有两大方向的思路. 1.系统架构层面.比如负载均衡.多级缓存.单元化部署等等. 2.单节点优化层面.比如修复代码级别的性能Bug.JVM参数调优.IO优化等等 ...

  10. 清橙 A1318 加强版:Almost

    题意: 直接看题面吧 原版:\(n \leq 1e5, q \leq 3e4, TL 5s, ML 256G\) 加强版1:\(n,q \leq 1.5e5, TL 5s, ML 256G\) 加强版 ...