可以为Nullable的可选参数

时间:2011-06-03 06:20:38

标签: c# .net entity-framework-4 linq-to-entities

我在asp.net mvc应用程序中使用带有edmx文件和POCO的实体框架4。

首先,我有一个人类,它被映射到数据库中的一个表。

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);
}

最后,Repository()函数返回一个IRepository<Person>,其中包含方法:

public IQueryable<TModel> GetAll(Expression<Func<TModel, bool>> predicate = null)
{
    var result = ObjectSet.AsQuaryable(); //ObjectSet is a ObjectSet<Person> instance
    if (predicate != null)
        result = result.Where(predicate);
    return result;
}

现在,问题是如果我将null作为parentPersonID传递给服务层,那么Get(null)。枚举不会产生任何结果。但是,如果我将服务层代码修改为:

public List<Person> Get(int? parentPersonID = null)
{
    var persons = Repository().GetAll(null);
}

一切都按预期工作。

任何想法为什么会这样?

修改: 如果我用:

替换服务层功能代码
var persons = Repository().GetAll(c => c.ParentID.Equals(parentPersonID));

而不是:

var persons = Repository().GetAll(c => c.ParentID == parentPersonID);

它按预期工作 - 第一行从数据库中检索记录,而第二行则不从。 我仍然很好奇在这种情况下Equals()==的区别。

1 个答案:

答案 0 :(得分:2)

怀疑这与如何处理相等性有关。试试这个:

public List<Person> Get(int? parentPersonID = null) {
    var persons = Repository().GetAll(parentPersonID == null ? 
          c => !c.ParentID.HasValue :                
          c => c.ParentID == parentPersonID);
    ... 
}

当您传入parentPersonID null时,这会将谓词更改为显式无效检查,而不是使其与您传入的值相匹配。可能会有一个更优雅的表达方式,但至少值得尝试一下。

(我假设如果您指定parentPersonID null,则希望所有人 为空parentPersonID,而不仅仅是所有人......这将是一个不同的变化。)