2013-04-30 95 views
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和值的程序代码调用它,我得到的预期值从数据库返回的。当我打这个电话,但明确设置x.ProgramCode和x.BrandCode为null,我得到预期的默认值从数据库返回的:

ContactEventValue value = ent.ContactEventValues.Single(
     x => x.ContactEventTypeID == contactEventType.ContactEventTypeID 
     && x.ProgramCode == null && x.BrandCode == null); 

然而,当我调用该方法对零和的程序代码brandCode,我从数据库中取回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我真的不想去那里。

任何想法?

回答

9

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

在EF 6,你就可以设置暴露在DbContextUseDatabaseNullSemantics配置选项:

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?中列出的其中一种解决方法。

+0

我们使用EF 5.0.0。我试图在配置上设置UseDatabaseNullSemantics,但UseDatabaseNullSemantics不存在。谷歌搜索它和UseDatabaseNullSemantics似乎并不存在于C#中。 – jgerman 2013-05-01 14:41:46

+0

我已经更新了我的答案。 – devdigital 2013-05-01 16:24:40

+0

我们使用.Net 4.5。这工作!非常感谢! – jgerman 2013-05-01 17:06:50

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是等价的。不理想。