使用null参数调用失败
我有以下代码:
public static ContactEventValue GetContactEventValue(ContactEventType contactEventType, string programCode, string brandCode) { AdvocacyEntities ent = AdvocacyEntities.GetReadOnlyInstance(); ContactEventValue value = ent.ContactEventValues.SingleOrDefault( x => x.ContactEventTypeID == contactEventType.ContactEventTypeID && x.ProgramCode == programCode && x.BrandCode == brandCode); }
当我用brandCode和programCode的值调用它时,我从数据库中获得了预期的值。 当我进行调用但显式设置x.ProgramCode和x.BrandCode为null时,我从数据库中获取预期的默认值:
ContactEventValue value = ent.ContactEventValues.Single( x => x.ContactEventTypeID == contactEventType.ContactEventTypeID && x.ProgramCode == null && x.BrandCode == null);
但是,当我为programCode和brandCode调用null方法时,我从数据库中返回null!
我尝试根据此问题的答案将==更改为.Equals(): Nullable可选参数
所以x.BrandCode.Equals(brandCode)取代了x.BrandCode == brandCode,而x.ProgramCode.Equals(programCode)取代了x.ProgramCode == programCode,但是仍然没有用。
我也试过用?? 操作员,仍然没有工作。
这个问题说没有找到解决方案,并且他/她必须使用存储过程: EF 4查询 – 多参数问题我真的不想去那里。
有任何想法吗?
我不知道你正在使用什么版本的EF,但是null比较是版本5之前的问题。如果你检查实际发出的SQL,你可能会看到查询中没有使用IS NULL
。
在EF 6中,您将能够设置在DbContext
上DbContext
的UseDatabaseNullSemantics
配置选项:
public class MyContext : DbContext { public MyContext() { this.Configuration.UseDatabaseNullSemantics = true; } }
对于EF 5,您可以在基础ObjectContext
上使用UseCSharpNullComparisonBehavior
设置:
public class MyContext : DbContext { public MyContext() { var objectContextAdapter = this as IObjectContextAdapter; objectContextAdapter. ObjectContext.ContextOptions.UseCSharpNullComparisonBehavior = true; } }
但是,您需要为项目使用.NET Framework 4.5。 如果您不想使用4.5,那么您可以使用在“ 如何在entity framework中查询空值”中列出的解决方法之一? 。
原来?? 运算符解决方案确实有效,我根本没有将它应用于==语句的两侧。 所以下面的代码解决了这个问题:
public static ContactEventValue GetContactEventValue(ContactEventType contactEventType, string programCode, string brandCode) { AdvocacyEntities ent = AdvocacyEntities.GetReadOnlyInstance(); ContactEventValue value = ent.ContactEventValues.SingleOrDefault( x => x.ContactEventTypeID == contactEventType.ContactEventTypeID && (x.ProgramCode ?? "") == (programCode ?? "") && (x.BrandCode ?? "") == (brandCode ?? ""));
但是,这会导致空字符串和null等效。 不理想。