呼叫与空参数失败
我有以下代码:呼叫与空参数失败
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我真的不想去那里。
任何想法?
我不知道你使用的是什么版本的EF,但是无效比较是版本5之前的问题。如果你检查实际发出的SQL,你可能会看到没有使用IS NULL
在查询中。
在EF 6,你就可以设置暴露在DbContext
的UseDatabaseNullSemantics
配置选项:
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?中列出的其中一种解决方法。
原来?运算符解决方案确实起作用,我只是没有将它应用于==语句的两侧。所以下面的代码解决了这个问题:
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不存在。谷歌搜索它和UseDatabaseNullSemantics似乎并不存在于C#中。 – jgerman 2013-05-01 14:41:46
我已经更新了我的答案。 – devdigital 2013-05-01 16:24:40
我们使用.Net 4.5。这工作!非常感谢! – jgerman 2013-05-01 17:06:50