Я использую Entity Framework 4 с файлами EDMX и POCO в приложении asp.net mvc.
Прежде всего, у меня есть класс 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);
}
Наконец, функция 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()
и ==
в этом случае.