博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
EF4.1中诡异的GUID为空问题
阅读量:6198 次
发布时间:2019-06-21

本文共 3383 字,大约阅读时间需要 11 分钟。

 在用EF4.1过程中发现了一个非常诡异的GUID为空问题,不说废话,直接看问题吧:

测试表UserInfo(SQL SERVER 2008 R2):

 

这里是建表SQL语句,供有兴趣朋友测试:

CREATE
 
TABLE
 
[
dbo
]
.
[
UserInfo
]
(
    
[
ID
]
 
[
int
]
 
IDENTITY
(
1
,
1
NOT
 
NULL
,
    
[
UserID
]
 
[
uniqueidentifier
]
 
NOT
 
NULL
,
    
[
UserName
]
 
[
nvarchar
]
(
50
NULL
,
    
[
Email
]
 
[
varchar
]
(
50
NOT
 
NULL
,
    
[
PicID
]
 
[
uniqueidentifier
]
 
NULL
,
    
PRIMARY
 
KEY
(
[
ID
]
)
)
GO

 

UserInfo实体类:

using
 System;
using
 System.Collections.Generic;
using
 System.Linq;
using
 System.Text;
using
 System.Runtime.Serialization;
using
 System.Data.Entity;
using
 System.ComponentModel.DataAnnotations;
namespace
 ConsoleTest
{
    [Serializable]
    [DataContract]
    [Table(
"
UserInfo
"
)]
    
public
 
class
 UserInfo
    {
        [DataMember]
        [Key]
        
public
 
int
 ID { 
get
set
; }
        [DataMember]
        
public
 Guid UserID { 
get
set
; }
        [DataMember]
        
public
 
string
 UserName { 
get
set
; }
        [DataMember]
        
public
 
string
 Email { 
get
set
; }
        [DataMember]
        
public
 Guid PicID { 
get
set
; }
    }
}

 

EF配置代码:

using
 System;
using
 System.Collections.Generic;
using
 System.Linq;
using
 System.Text;
using
 System.Data.Entity;
using
 System.Configuration;
namespace
 ConsoleTest
{
    
public
 
class
 TestDBContext : DbContext
    {
        
public
 TestDBContext()
            : 
base
(
"
Test
"
)
        {
        }
        
public
 DbSet
<
UserInfo
>
 UserInfos { 
get
set
; }
    }

}

 

测试方法:

using
 System;
using
 System.Collections.Generic;
using
 System.Linq;
using
 System.Text;
using
 System.Data.SqlClient;
namespace
 ConsoleTest
{
    
public
 
class
 NullTest
    {
        
public
 List
<
UserInfo
>
 GetUserInfo()
        {
            
using
 (TestDBContext context 
=
 
new
 TestDBContext())
            {
                List
<
UserInfo
>
 users 
=
 context.UserInfos
                    .Where(m
=>
m.UserID
!=
null
)
                    .Where(n
=>
n.UserName
!=
null
)
                    .Where(p
=>
p.Email
!=
null
)
                    .Where(q
=>
q.PicID
!=
null
)
                    .ToList();
                
return
 users;
            }
        }
        
public
 List
<
UserInfo
>
 GetUserInfoNew()
        {
            
using
 (TestDBContext context 
=
 
new
 TestDBContext())
            {
                List
<
UserInfo
>
 users 
=
 context.UserInfos
                    .Where(m 
=>
 m.UserID 
!=
 Guid.Empty)
                    .Where(n 
=>
 n.UserName 
!=
 
null
)
                    .Where(p 
=>
 p.Email 
!=
 
null
)
                    .Where(q 
=>
 q.PicID 
!=
 
new
 Guid(
"
00000000-0000-0000-0000-000000000000
"
))
                    .ToList();
                
return
 users;
            }
        }
    }

 

调用:

using
 System;
using
 System.Collections.Generic;
using
 System.Linq;
using
 System.Text;
using
 System.Text.RegularExpressions;
namespace
 ConsoleTest
{
    
class
 Program
    {
        
static
 
void
 Main(
string
[] args)
        {
            NullTest nullTest 
=
 
new
 NullTest();
            nullTest.GetUserInfo();
            nullTest.GetUserInfoNew();
            Console.Read();
        }
    }

 

用SQL SERVER Profiler工具检测到的第一个方法SQL语句:

SELECT
 
[
Extent1
]
.
[
ID
]
 
AS
 
[
ID
]
[
Extent1
]
.
[
UserID
]
 
AS
 
[
UserID
]
[
Extent1
]
.
[
UserName
]
 
AS
 
[
UserName
]
[
Extent1
]
.
[
Email
]
 
AS
 
[
Email
]
[
Extent1
]
.
[
PicID
]
 
AS
 
[
PicID
]
FROM
 
[
dbo
]
.
[
UserInfo
]
 
AS
 
[
Extent1
]

WHERE ([Extent1].[UserName] IS NOT NULLAND ([Extent1].[Email] IS NOT NULL) 

  

 第二个方法SQL语句:

 exec sp_executesql N'SELECT 

[Extent1].[ID] AS [ID], 
[Extent1].[UserID] AS [UserID], 
[Extent1].[UserName] AS [UserName], 
[Extent1].[Email] AS [Email], 
[Extent1].[PicID] AS [PicID]
FROM [dbo].[UserInfo] AS [Extent1]
WHERE ([Extent1].[UserID] <> @p__linq__0) AND ([Extent1].[UserName] IS NOT NULL) AND ([Extent1].[Email] IS NOT NULL) AND (cast(
''
00000000-0000-0000-0000-000000000000
''
 as uniqueidentifier) <> [Extent1].[PicID])
'
,N
'
@p__linq__0 uniqueidentifier
'
,
@p__linq__0
=
'
00000000-0000-0000-0000-000000000000
'

 

诡异在第一个方法生成的SQL语句中类型为GUID的两个字段的不为空的条件没有了,第二个方法是本人针对第一种方法不足提供的一种解决方案,不知大家有什么看法,怎么解决这一问题的,请不吝赐教!

本文转自博客园博客,原文链接:,如需转载请自行联系原作者

你可能感兴趣的文章
公司框架遇到的问题
查看>>
详解 Discuz 的 PHP经典加密解密函数 authcode
查看>>
Mysql XX 天之内
查看>>
Oracle如何删除表中重复记录
查看>>
nginx 是如何处理访问请求的
查看>>
wget参数用法详解
查看>>
【COCOS2D-X(1.X 2.X)】Json(cpp版)以及添加自定义字体库教程
查看>>
使用curl命令查看访问url的时间
查看>>
python添加环境变量
查看>>
DP-01背包 (题)
查看>>
WinForm中跨线程操作控件
查看>>
CODING 敏捷实践完全指南
查看>>
unittest测试框架和测试报告的输出实例(一)
查看>>
下MFC中对象、句柄、ID之间的区别.
查看>>
如何构建Win32汇编的编程环境(ONEPROBLEM个人推荐)
查看>>
Asp.Net MVC 分页、检索、排序整体实现
查看>>
python 输出当前行号
查看>>
12C -- 配置Application Continuity
查看>>
Flymeos插桩适配教程
查看>>
Elasticsearch教程(九) elasticsearch 查询数据 | 分页查询
查看>>