我有以下代码:
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 optional parameter
所以x.BrandCode.Equals(brandCode)取代了x.BrandCode == brandCode,而x.ProgramCode.Equals(programCode)取代了x.ProgramCode == programCode,但仍然没有用。
我也试过用??操作员,仍然没有工作。
这个问题说没有找到解决方案,并且他/她必须使用存储过程:EF 4 Query - Issue with Multiple Parameters我真的不想去那里。
有什么想法吗?
答案 0 :(得分:9)
我不知道您使用的是哪个版本的EF,但是在版本5之前,null比较是一个问题。如果您检查实际发出的SQL,您可能会看到IS NULL
在查询中未使用。
在EF 6中,您可以设置UseDatabaseNullSemantics
上公开的DbContext
配置选项:
public class MyContext : DbContext
{
public MyContext()
{
this.Configuration.UseDatabaseNullSemantics = true;
}
}
对于EF 5,您可以使用基础UseCSharpNullComparisonBehavior
上的ObjectContext
设置:
public class MyContext : DbContext
{
public MyContext()
{
var objectContextAdapter = this as IObjectContextAdapter;
objectContextAdapter.
ObjectContext.ContextOptions.UseCSharpNullComparisonBehavior = true;
}
}
但是,您需要为项目使用.NET Framework 4.5。如果您不想使用4.5,那么您可以使用How can i query for null values in entity framework?中列出的解决方法之一。
答案 1 :(得分:1)
原来??运算符解决方案确实有效,我根本没有将它应用于==语句的两侧。所以下面的代码解决了这个问题:
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等效。不理想。