Я только что столкнулся с довольно удивительной проблемой.
Случай прост: вернуть все объекты, которые в данный момент активны, что означает: отфильтровать все результаты, возвращенные методом GetAll()
, в соответствии с их логическим свойством Active
public IQueryable<T> GetAllActive()
{
return implementation.GetAll().Where(a => ((IDeactivable)a).Active);
}
где GetAll()
метод объекта реализации определяется как:
public IQueryable<T> GetAll();
Проблема в том, что GetAllActive()
возвращает все записи, независимо от значения их свойства Active,точно так же, как нет предложения Where.
В чем может быть причина этого?
Примечание: Код упрощен, тип T
проверен для реализацииIDeactivable
интерфейс.Также во время выполнения не генерируется никаких исключений.
Редактировать: IQueryable, возвращаемый объектом реализации, поступает из NHibernate
Edit2: Я использовал следующий кодчтобы проверить фактические значения для сущностей (кроме использования VS Debugger):
foreach (var a in active) { //active -> filtered IQueryable before return
_logger.Warn(a.Id);
_logger.Warn(((IDeactivable)a).Active);
}
результат был:
11/30/2011 18:10:00 WARN xxx.Repository`1.GetAllActive: 70db43fa-2361-4c1f-a8e5-9fab012b5a2b
11/30/2011 18:10:01 WARN xxx.Repository`1.GetAllActive: False
11/30/2011 18:10:02 WARN xxx.Repository`1.GetAllActive: 5493c9bb-ec6e-4690-b5d6-9fab012b5b16
11/30/2011 18:10:02 WARN xxx.Repository`1.GetAllActive: True