问题描述
刚刚学习EF不久,有一个问题百思不得其解。希望大家能够帮助我,谢谢//1bool?boolVar=null;Barbar=entities.bars.SingleOrDefault(o=>p.variable==boolVar);//2Barbar=entities.bars.SingleOrDefault(o=>p.variable==null);Debug的时候发现bars这个DBSet里面存在我需要的唯一的bar对象。当执行语句1的时候,bar是null当执行语句2的时候,bar对象被正常返回。请问到底怎么回事?
解决方案
解决方案二:
你可以tostring一下看两句linq生成的sql有什么区别
解决方案三:
你用数据库中的sqlserverprofiler看一下生成的sql语句吧
解决方案四:
entities.bars.SingleOrDefault(o=>p.variable==boolVar);context.Database.Log=log=>System.Diagnostics.Debug.WriteLine(log);entities.bars.SingleOrDefault(o=>p.variable==null);context.Database.Log=log=>System.Diagnostics.Debug.WriteLine(log);在VS中左下角的输入窗口中可以看到生成的sql语句
解决方案五:
根据两位的提示看了一下SQL.语句1会生成类似:extent1.variable=@p_linq_1作为查询条件语句2会生成类似:extent1.variableisnull作为查询条件可以看出不同了,可是仍旧不是很明白原因,我在语句1之前已经设置过了boolVar的值为null啊
解决方案六:
而且不知道为什么我试了试3楼的方法,没有办法编译,给出的错误是'System.Data.Entity.Database'doesnotcontainadefinitionfor'Log'andnoextensionmethod'Log'acceptingafirstargumentoftype'System.Data.Entity.Database'couldbefound(areyoumissingausingdirectiveoranassemblyreference?)
解决方案七:
你直接将linq语句toString然后调试停下来看就行了
解决方案八:
因为boolVar的数据类型是bool,虽然它支持赋值为null,但是不会转为isnull这样的判断语句,而只能是等号判断。
解决方案九:
除非是外键约束的字段,否则尽量不要在设计数据库时留下可为空的字段。
解决方案十:
引用4楼AHXYS的回复:
根据两位的提示看了一下SQL.语句1会生成类似:extent1.variable=@p_linq_1作为查询条件语句2会生成类似:extent1.variableisnull作为查询条件可以看出不同了,可是仍旧不是很明白原因,我在语句1之前已经设置过了boolVar的值为null啊
@p_linq_1用sqlserverprofiler,里面会有参数值的,看看参数是多少,然后看看sql语句是不是有细微的差别。你把两个语句完整的贴出来看看。
解决方案十一:
引用5楼AHXYS的回复:
而且不知道为什么我试了试3楼的方法,没有办法编译,给出的错误是'System.Data.Entity.Database'doesnotcontainadefinitionfor'Log'andnoextensionmethod'Log'acceptingafirstargumentoftype'System.Data.Entity.Database'couldbefound(areyoumissingausingdirectiveoranassemblyreference?)
Log方法是可以点出来的,是在EntityFramework.dll中的,我这边版本是6.0,你是不是没有引用ef包
解决方案十二:
引用10楼laokaizzz的回复:
Quote: 引用5楼AHXYS的回复:
而且不知道为什么我试了试3楼的方法,没有办法编译,给出的错误是'System.Data.Entity.Database'doesnotcontainadefinitionfor'Log'andnoextensionmethod'Log'acceptingafirstargumentoftype'System.Data.Entity.Database'couldbefound(areyoumissingausingdirectiveoranassemblyreference?)Log方法是可以点出来的,是在EntityFramework.dll中的,我这边版本是6.0,你是不是没有引用ef包
我们用DBFirst的方法做的,然后反向工程到VS2012中的,我用的EF5.0用NuGet来安装的EF,并且在Reference中也有EntityFramework,配置文件里有对System.Data.Entity的引用,我感觉包应该没问题吧,毕竟如果没有引用包的话VS会自动提示帮你找的。可是Log完全找不到。
解决方案十三:
引用11楼AHXYS的回复:
Quote: 引用10楼laokaizzz的回复:
Quote: 引用5楼AHXYS的回复:
而且不知道为什么我试了试3楼的方法,没有办法编译,给出的错误是'System.Data.Entity.Database'doesnotcontainadefinitionfor'Log'andnoextensionmethod'Log'acceptingafirstargumentoftype'System.Data.Entity.Database'couldbefound(areyoumissingausingdirectiveoranassemblyreference?)Log方法是可以点出来的,是在EntityFramework.dll中的,我这边版本是6.0,你是不是没有引用ef包
我们用DBFirst的方法做的,然后反向工程到VS2012中的,我用的EF5.0用NuGet来安装的EF,并且在Reference中也有EntityFramework,配置文件里有对System.Data.Entity的引用,我感觉包应该没问题吧,毕竟如果没有引用包的话VS会自动提示帮你找的。可是Log完全找不到。
不知道是不是5.0中没有,你可以在nuget中安装最新的6.0试试。不过5.0应该支持吧。我的代码是这样的:publicclassSysDb:DbContext{publicSysDb(stringconnString)://数据库链接字符串base(connString){Database.SetInitializer<SysDb>(null);//设置为空,防止自动检查和生成base.Database.Log=(info)=>Debug.WriteLine(info);}//...其他代码}
解决方案十四:
从升级内容来看,调试log输出是6.0才有的。