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 を置き換えましたが、それでも機能しませんでした。

私も使ってみました?? オペレーター、まだ機能しませんでした。

この問題は、解決策が見つからなかったことを示しており、ストアド プロシージャを使用する必要 がありました。

何か案は?

4

2 に答える 2

9

使用している EF のバージョンはわかりませんが、null 比較はバージョン 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 を使用したくない場合は、エンティティ フレームワークで null 値を照会するにはどうすればよいですか? に記載されている回避策のいずれかを使用できます。.

于 2013-04-30T22:30:11.150 に答える