C# 调用失败,参数为null
我有以下代码:C# 调用失败,参数为null,c#,linq,entity-framework,linq-to-entities,C#,Linq,Entity Framework,Linq To Entities,我有以下代码: public static ContactEventValue GetContactEventValue(ContactEventType contactEventType, string programCode, string brandCode) { AdvocacyEntities ent = AdvocacyEntities.GetReadOnlyInstance(); ContactEventValue value = ent.ContactEventV
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);
然而,当我用null调用programCode和brandCode的方法时,我从数据库返回null
我尝试根据此问题的答案将==更改为.Equals():
因此,x.BrandCode.Equals(BrandCode)取代了x.BrandCode==BrandCode,x.ProgramCode.Equals(ProgramCode)取代了x.ProgramCode==ProgramCode,但这仍然不起作用
我也试过用??接线员,还是没用
这个问题说没有找到解决方案,他/她不得不使用存储过程:我真的不想去那里
有什么想法吗?我不知道您使用的是什么版本的EF,但在版本5之前,空比较是一个问题。如果您检查实际发出的SQL,您可能会看到查询中没有使用
为NULL
在EF 6中,您将能够设置UseDatabaseNullSemantics
上公开的DbContext
配置选项:
public class MyContext : DbContext
{
public MyContext()
{
this.Configuration.UseDatabaseNullSemantics = true;
}
}
public class MyContext : DbContext
{
public MyContext()
{
var objectContextAdapter = this as IObjectContextAdapter;
objectContextAdapter.
ObjectContext.ContextOptions.UseCSharpNullComparisonBehavior = true;
}
}
对于EF 5,您可以在基础ObjectContext
上使用UseCSharpNullComparisonBehavior
设置:
public class MyContext : DbContext
{
public MyContext()
{
this.Configuration.UseDatabaseNullSemantics = true;
}
}
public class MyContext : DbContext
{
public MyContext()
{
var objectContextAdapter = this as IObjectContextAdapter;
objectContextAdapter.
ObjectContext.ContextOptions.UseCSharpNullComparisonBehavior = true;
}
}
但是,您需要在项目中使用.NET Framework 4.5。如果您不希望使用4.5,则可以使用中列出的解决方法之一。结果是??运算符解决方案确实有效,但我并没有将其应用于==语句的两侧。下面的代码解决了这个问题:
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相等。不理想。我们使用的是EF 5.0.0。我试图在配置上设置UseDatabaseNullSemantics,但UseDatabaseNullSemantics不存在。谷歌搜索了一下,发现C#中似乎不存在UseDatabaseNullSemantics。