zoukankan      html  css  js  c++  java
  • EF4.1中诡异的GUID为空问题

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

    测试表UserInfo(SQL SERVER 2008 R2):

     

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

    CREATE TABLE [dbo].[UserInfo](
        
    [ID] [int] IDENTITY(1,1NOT NULL,
        
    [UserID] [uniqueidentifier] NOT NULL,
        
    [UserName] [nvarchar](50NULL,
        
    [Email] [varchar](50NOT 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 { getset; }

            [DataMember]
            
    public Guid UserID { getset; }

            [DataMember]
            
    public string UserName { getset; }

            [DataMember]
            
    public string Email { getset; }

            [DataMember]
            
    public Guid PicID { getset; }
        }
    }

    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 { getset; }
        }

    }

    测试方法:

    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的两个字段的不为空的条件没有了,第二个方法是本人针对第一种方法不足提供的一种解决方案,不知大家有什么看法,怎么解决这一问题的,请不吝赐教!

  • 相关阅读:
    Git 在Idea下的操作
    负载均衡算法-java实现
    MySQL 上亿大表优化实践 转
    盘点 10 个代码重构的小技巧
    wireshark抓包工具详细说明及操作使用
    限流
    Semaphore
    CyclicBarrier
    CountDownLatch和枚举配合使用
    ReentrantReadWriteLock读写锁
  • 原文地址:https://www.cnblogs.com/artwl/p/2036907.html
Copyright © 2011-2022 走看看