转:Entity Framework对NULL值的处理
今天拿Entity Framework改写早期的一个项目,涉及到对NULL值处理的时候,遇到了点问题,就是如何查询数据库中某字段为NULL的记录,写了几个测试用的例子,然后用SQL Server Profiler抓SQL。
测试1:直接使用null
- var clients = ctx.Clients.Where(c => c.ParentGUID == null);
对应的SQL是:
- -- 执行正常
- SELECT
- [Extent1].[GUID] AS [GUID],
- [Extent1].[Name] AS [Name],
- [Extent1].[ParentGUID] AS [ParentGUID]
- FROM [dbo].[Clients] AS [Extent1]
- WHERE [Extent1].[ParentGUID] IS NULL
测试2:使用等于null的变量:
- string parentGuid = null;
- var clients = ctx.Clients.Where(c => c.ParentGUID == parentGuid);
对应的SQL是:
- -- 使用了值为NULL的变量,但是用了等号,所以取不到值了
- exec sp_executesql N'SELECT
- [Extent1].[GUID] AS [GUID],
- [Extent1].[Name] AS [Name],
- [Extent1].[ParentGUID] AS [ParentGUID]
- FROM [dbo].[Clients] AS [Extent1]
- WHERE [Extent1].[ParentGUID] = @p__linq__0',N'@p__linq__0 varchar(8000)',@p__linq__0=NULL
测试3:加判断
- string parentGuid = null;
- var clients = ctx.Clients.Where(c => c.ParentGUID == (string.IsNullOrEmpty(parentGuid) ? null : parentGuid));
对应的SQL是:
- -- 无语了,这也整得太复杂了吧,显然得不到正确结果
- exec sp_executesql N'SELECT
- [Extent1].[GUID] AS [GUID],
- [Extent1].[Name] AS [Name],
- [Extent1].[ParentGUID] AS [ParentGUID]
- FROM [dbo].[Clients] AS [Extent1]
- WHERE [Extent1].[ParentGUID] = (
- CASE
- WHEN ((@p__linq__0 IS NULL) OR (( CAST(LEN(@p__linq__0) AS int)) = 0))
- THEN CAST(NULL AS varchar(1))
- ELSE @p__linq__1
- END
- )',N'@p__linq__0 nvarchar(4000),@p__linq__1 nvarchar(4000)',@p__linq__0=NULL,@p__linq__1=NULL
测试4:另一种方式加判断
- string parentGuid = null;
- var clients = ctx.Clients.Where(c => string.IsNullOrEmpty(parentGuid) ? c.ParentGUID == null : c.ParentGUID == parentGuid);
对应的SQL是:
- --继续无语,比刚才的还复杂,同样得不到正确结果
- exec sp_executesql N'SELECT
- [Extent1].[GUID] AS [GUID],
- [Extent1].[Name] AS [Name],
- [Extent1].[ParentGUID] AS [ParentGUID]
- FROM [dbo].[Clients] AS [Extent1]
- WHERE (
- CASE
- WHEN ((@p__linq__0 IS NULL) OR (( CAST(LEN(@p__linq__0) AS int)) = 0))
- THEN cast(0 as bit)
- WHEN ([Extent1].[ParentGUID] = @p__linq__1)
- THEN cast(1 as bit)
- WHEN ([Extent1].[ParentGUID] <> @p__linq__1)
- THEN cast(0 as bit)
- END
- ) = 1',N'@p__linq__0 nvarchar(4000),@p__linq__1 varchar(8000)',@p__linq__0=NULL,@p__linq__1=NULL
晕倒,看来把Linq的思想直接往EF上套是行不通的,某些情况下差异还是挺大的。
转:Entity Framework对NULL值的处理的更多相关文章
- Entity Framework的默认值BUG解决方法
在使用.Net 3.5里的Entity Framework开发网站的时候,遇到了一个问题:添加记录时,对于DateTime型的数据,无法使用数据库的默认值. 具体的情况是这样的,我的数据库有个User ...
- 《Entity Framework 6 Recipes》中文翻译系列 (14) -----第三章 查询之查询中设置默认值和存储过程返回多结果集
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-6在查询中设置默认值 问题 你有这样一个用例,当查询返回null值时,给相应属性 ...
- decimal类型不能为空,自定义update更新null值的问题。
if (!string.IsNullOrEmpty(yt_time_limit_1)) { entity["yt_time_limit_1"] = Convert.ToDecima ...
- 《Entity Framework 6 Recipes》中文翻译系列 (10) -----第二章 实体数据建模基础之两实体间Is-a和Has-a关系建模、嵌入值映射
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 2-11 两实体间Is-a和Has-a关系建模 问题 你有两张有Is-a和Has-a ...
- 《Entity Framework 6 Recipes》中文翻译系列 (44) ------ 第八章 POCO之POCO中使用值对象和对象变更通知
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 8-4 POCO中使用值对象(Complex Type--也叫复合类型)属性 问题 ...
- 转载Entity Framework 4.1 DbContext使用记之三——如何玩转实体的属性值?
Entity Framework 4.1 DbContext使用记之一——如何查找实体? DbSet.Find函数的使用与实现 Entity Framework 4.1 DbContext使用记之二— ...
- Entity Framework Core的贴心:优雅处理带默认值的数据库字段
对于用于保存记录添加时间的数据库日期字段,我们通常会设置一个 GETDATE() 的默认值,而不是在应用程序的代码中获取当前时间进行保存,这样可以避免由于web服务器时钟不同步引起的时间偏差. Ent ...
- 关于Entity Framework更新的几种方式以及可能遇到的问题(附加类型“Model”的实体失败,因为相同类型的其他实体已具有相同的主键值)在使用 "Attach" 方法或者将实体的状态设置为 "Unchanged" 或 "Modified" 时如果图形中的任何实体具有冲突键值,则可能会发生上述行为
在日常使用Entity Framework中,数据更新通常会用到.下面就简单封装了一个DBContext类 public partial class EFContext<T> : DbCo ...
- Entity Framework添加记录时获取自增ID值
与Entity Framework相伴的日子痛并快乐着.今天和大家分享一下一个快乐,两个痛苦. 先说快乐的吧.Entity Framework在将数据插入数据库时,如果主键字段是自增标识列,会将该自增 ...
随机推荐
- Winform设置相关
>> Winform查找根目录 1) AppDomain.CurrentDomain.BaseDirectory 地址为: d:\MyProject\Bin\ Application. ...
- 理解ASP.NET MVC Framework Action Filters
原文:http://www.cnblogs.com/darkdawn/archive/2009/03/13/1410477.html 本指南主要解释action filters,action filt ...
- ZOJ3718 Diablo II(状态压缩dp)
题意:一个人物有K(K<=7)种技能,每种技能都有bi,ci,di值,表示该技能不能点超过bi次,每点一次加ci,点满bi次有一个附加得分di.然后还有N件武器,武器本身会有能力加成,然后每个武 ...
- 能够将 HTML 表格转换成图表的jQuery插件:Chartinator
点这里 一个jQuery 插件能够将HTML 表格转换成图表,使用 Google Charts 实现. Chartinator当前支持以下特性: Creation of the following c ...
- C# 实现抓取网站页面内容
抓取新浪网的新闻栏目,如图所示: 使用 谷歌浏览器的查看源代码: 通过分析得知,我们所要找的内容在以下两个标签之间: <!-- publish_helper name='要闻-新闻' p_id= ...
- jmeter线程组之间传递参数
JMeter 变量作用域局限于所属线程.这样设计是经过深思熟虑的,目的是让测试线程能够独立运转.有时候用户可能需要在不同线程间(可能属于同一个线程组,也可能不属于同一个线程组)传递变量. 其中一种方法 ...
- lintcode :最长公共前缀
题目 最长公共前缀 给k个字符串,求出他们的最长公共前缀(LCP) 样例 在 "ABCD" "ABEF" 和 "ACEF" 中, LCP ...
- HBase使用场景和成功案例
1 典型互联网搜索问题:BigTable发明的原因 搜索使用场景 1) 爬虫持续不断地抓取新页面,这些页面每页一行地存储到HBase里. 2 )MapReduce计算作业运行在整张表上,生成索引,为网 ...
- mq_setattr
NAME mq_setattr - 设置消息队列的属性(REALTIME) SYNOPSIS #include <mqueue.h> int mq_setattr(mqd_t mqdes, ...
- SWD应用接口
随着ARM公司对Cortex系列的推出,采样SWD方式调试成了大家的首选.SWD不仅速度可以与JTAG媲美,而且使用的调试线少得多.很多人在采样SWD方式进行调试时,一般都是采用4线: ① VCC ...