C# 可为空的可选参数

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

我正在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 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
,您希望得到所有具有null
parentPersonID的人,而不仅仅是所有人……这将是一个不同的变化。)

您的假设是正确的,是的。此外,显式检查有效(与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);
    ... 
}