Где предложение с объектом 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".