Обнуляемый необязательный параметр - PullRequest
3 голосов
/ 03 июня 2011

Я использую 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() и == в этом случае.

1 Ответ

2 голосов
/ 03 июня 2011

Я подозреваю это связано с тем, как решается вопрос равенства.Попробуйте это:

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, а не просто все люди ... это было бы другим изменением.)

...