使用null参数调用失败

时间:2013-04-30 22:16:32

标签: c# linq entity-framework linq-to-entities

我有以下代码:

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我真的不想去那里。

有什么想法吗?

2 个答案:

答案 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等效。不理想。