6

我有以下代码:

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

有任何想法吗?

4

2 回答 2

9

我不知道您使用的是哪个版本的 EF,但空值比较在版本 5 之前是一个问题。如果您检查实际发出的 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,则可以使用如何在实体框架中查询空值?.

于 2013-04-30T22:30:11.150 回答
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 等效。不理想。

于 2013-05-01T17:02:33.420 回答