c# – 使用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 optional parameter

所以x.BrandCode.Equals(brandCode)取代了x.BrandCode == brandCode,而x.ProgramCode.Equals(programCode)取代了x.ProgramCode == programCode,但仍然没有用.

我也试过用??运算符,仍然没有工作.

这个问题说没有找到解决方案,并且他/她必须使用存储过程:EF 4 Query – Issue with Multiple Parameters我真的不想去那里.

有任何想法吗?

解决方法

我不知道你正在使用什么版本的EF,但是null比较是版本5之前的问题.如果检查实际发出的sql,你可能会看到查询中没有使用IS NULL .

在EF 6中,您将能够设置在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,则可以使用How can i query for null values in entity framework?中列出的解决方法之一.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...