Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 调用失败,参数为null_C#_Linq_Entity Framework_Linq To Entities - Fatal编程技术网

C# 调用失败,参数为null

C# 调用失败,参数为null,c#,linq,entity-framework,linq-to-entities,C#,Linq,Entity Framework,Linq To Entities,我有以下代码: public static ContactEventValue GetContactEventValue(ContactEventType contactEventType, string programCode, string brandCode) { AdvocacyEntities ent = AdvocacyEntities.GetReadOnlyInstance(); ContactEventValue value = ent.ContactEventV

我有以下代码:

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);
然而,当我用null调用programCode和brandCode的方法时,我从数据库返回null

我尝试根据此问题的答案将==更改为.Equals():

因此,x.BrandCode.Equals(BrandCode)取代了x.BrandCode==BrandCode,x.ProgramCode.Equals(ProgramCode)取代了x.ProgramCode==ProgramCode,但这仍然不起作用

我也试过用??接线员,还是没用

这个问题说没有找到解决方案,他/她不得不使用存储过程:我真的不想去那里


有什么想法吗?

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

在EF 6中,您将能够设置
UseDatabaseNullSemantics
上公开的
DbContext
配置选项:

public class MyContext : DbContext
{
    public MyContext()
    {
        this.Configuration.UseDatabaseNullSemantics = true;
    }
}
public class MyContext : DbContext
{
    public MyContext()
    {
        var objectContextAdapter = this as IObjectContextAdapter;
        objectContextAdapter.
            ObjectContext.ContextOptions.UseCSharpNullComparisonBehavior = true;    
    }
}
对于EF 5,您可以在基础
ObjectContext
上使用
UseCSharpNullComparisonBehavior
设置:

public class MyContext : DbContext
{
    public MyContext()
    {
        this.Configuration.UseDatabaseNullSemantics = true;
    }
}
public class MyContext : DbContext
{
    public MyContext()
    {
        var objectContextAdapter = this as IObjectContextAdapter;
        objectContextAdapter.
            ObjectContext.ContextOptions.UseCSharpNullComparisonBehavior = true;    
    }
}

但是,您需要在项目中使用.NET Framework 4.5。如果您不希望使用4.5,则可以使用中列出的解决方法之一。

结果是??运算符解决方案确实有效,但我并没有将其应用于==语句的两侧。下面的代码解决了这个问题:

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相等。不理想。

我们使用的是EF 5.0.0。我试图在配置上设置UseDatabaseNullSemantics,但UseDatabaseNullSemantics不存在。谷歌搜索了一下,发现C#中似乎不存在UseDatabaseNullSemantics。