2013-04-30 102 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是等價的。不理想。