C# 可为空的可选参数
我正在asp.net mvc应用程序中使用实体框架4和edmx文件和POCO 首先,我有一个person类,它映射到数据库中的一个表C# 可为空的可选参数,c#,.net,entity-framework-4,linq-to-entities,C#,.net,Entity Framework 4,Linq To Entities,我正在asp.net mvc应用程序中使用实体框架4和edmx文件和POCO 首先,我有一个person类,它映射到数据库中的一个表 public class Person { public Int32 ID{get;set;} public string Name{get;set;} public Int32? ParentID{get;set;} } 然后在我的服务层中,我有以下函数来检索所有的人。如果提供了parentID,则检索到的人员将是具有该parentID
public class Person
{
public Int32 ID{get;set;}
public string Name{get;set;}
public Int32? ParentID{get;set;}
}
然后在我的服务层中,我有以下函数来检索所有的人。如果提供了parentID,则检索到的人员将是具有该parentID的人员:
public List<Person> Get(int? parentPersonID = null)
{
var persons = Repository().GetAll(c => c.ParentID == parentPersonID);
}
一切正常
你知道为什么吗
编辑:
如果我将服务层功能代码替换为:
var persons = Repository().GetAll(c => c.ParentID.Equals(parentPersonID));
而不是:
var persons = Repository().GetAll(c => c.ParentID == parentPersonID);
它按预期工作-第一行从数据库中检索记录,而第二行不检索记录。
我仍然很好奇在这种情况下,Equals()
和=
的区别是什么。我怀疑这与如何处理平等有关。试试这个:
public List<Person> Get(int? parentPersonID = null) {
var persons = Repository().GetAll(parentPersonID == null ?
c => !c.ParentID.HasValue :
c => c.ParentID == parentPersonID);
...
}
公共列表获取(int?parentPersonID=null){
var persons=Repository().GetAll(parentPersonID==null?
c=>!c.ParentID.HasValue:
c=>c.ParentID==parentPersonID);
...
}
当您传入null
的parentPersonID
时,这会将谓词更改为显式空性检查,而不是使其仅与传入的值匹配。也许有一种更优雅的表达方式,但至少值得一试
(我假设如果您指定一个
parentPersonID
为null
的parentPersonID
,您希望得到所有具有nullparentPersonID的人,而不仅仅是所有人……这将是一个不同的变化。)您的假设是正确的,是的。此外,显式检查有效(与Equals()的结果相同)。不过,我很好奇,对于值为null的变量的等式是如何处理的。后来也发现了这个:@sTodorov:是的,我的解决方法是这样的,但稍微早一点——因此,无论哪种方式,最终都会得到一个简单的谓词。
var persons = Repository().GetAll(c => c.ParentID == parentPersonID);
public List<Person> Get(int? parentPersonID = null) {
var persons = Repository().GetAll(parentPersonID == null ?
c => !c.ParentID.HasValue :
c => c.ParentID == parentPersonID);
...
}