我在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()
和==
的区别。
答案 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
,而不仅仅是所有人......这将是一个不同的变化。)