Где предложение с объектом Null с использованием платформы Entity Framework v5.0RC
Я пытался сделать следующее
public IList<Category> GetMainCategories()
{
return _context.Category
.Where(x => x.ParentCategory == null)
.OrderBy(x => x.SortOrder)
.ToList();
}
Однако, что бы я ни старался, это не дает никаких результатов, хотя я могу видеть в коллекции, что ALL ParentCategory имеет значение null? Я прочитал, что EF имеет проблемы с нулями, подобными этому, а также попробовал
.Where(x => x.ParentCategory.Equals(null))
И
.Where(x => Equals(x.ParentCategory.Id, null))
.Where(x => Equals(x.ParentCategory, null))
Но еще такой же результат? Я потерялся? Как я могу проверить, является ли объект нулевым? Когда я проверяю его в VS2010, явно указывается его нулевое значение?
Обновление
Я могу заставить его работать над этим, НО его безумно неэффективно!!! ДОЛЖЕН быть в состоянии сделать это в запросе, или я скорее потрясен EF! Любая помощь очень ценится?
public IList<Category> GetMainCategories()
{
var cats = _context.Category
.OrderBy(x => x.SortOrder)
.ToList()
.Where(cat => cat.ParentCategory == null)
.ToList();
return cats;
}
Ответы
Ответ 1
Если запрос...
_context.Category
.Where(x => x.ParentCategory == null)
.OrderBy(x => x.SortOrder)
.ToList()
... возвращает пустую коллекцию, это означает, что все категории в базе данных имеют ParentCategory
или что таблица категорий пуста. Это все.
Тот факт, что в сборнике результатов этого запроса...
_context.Category
.OrderBy(x => x.SortOrder)
.ToList()
... каждая категория не имеет ParentCategory
не доказывает, что каждая категория не имеет ParentCategory
в базе данных.
Знаете ли вы об основах загрузки или не связанных с загрузкой объектов с EF? Я предлагаю прочитать это введение для EF >= 4.1/ DbContext
: http://blogs.msdn.com/b/adonet/archive/2011/01/31/using-dbcontext-in-ef-feature-ctp5-part-6-loading-related-entities.aspx
Ответ 2
В ваших результатах не гарантируется, что ссылки на самом деле null
в базе данных, даже если вы видите null
в возвращаемых результатах.
Используйте этот запрос, чтобы заставить EF загрузить справочные данные:
public IList<Category> GetMainCategories()
{
return _context.Category
.Include(x => x.ParentCategory) // for the new EF versions
.Include("ParentCategory") // for older EF versions
// .Where(x => x.ParentCategory == null)
.OrderBy(x => x.SortOrder)
.ToList();
}
Обратите внимание, что метод Include()
не влияет на то, как работает Where
, он просто убеждается, что при просмотре свойства ParentCategory
в окне отладчика (или доступа из кода) у вас будут данные.
Ответ 3
Это может быть устаревшим, но я думаю, что это тот ответ, который вы искали:
public abstract class YourContext : DbContext
{
public YourContext()
{
(this as IObjectContextAdapter).ObjectContext.ContextOptions.UseCSharpNullComparisonBehavior = true;
}
}
Это должно решить ваши проблемы, поскольку Entity Framerwork будет использовать сравнение "С# like".