0

我试图做以下事情

    public IList<Category> GetMainCategories()
    {
         return _context.Category
                 .Where(x => x.ParentCategory == null)
                 .OrderBy(x => x.SortOrder)
                 .ToList();
    }

但是,无论我尝试什么,即使我可以在集合中看到所有 ParentCategory 都为空,它也不会返回任何结果?我读过 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;
    }
4

3 回答 3

0

如果查询...

_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/ 的介绍:http DbContext: //blogs.msdn.com/b/adonet/archive/2011/01/31/using-dbcontext-in-ef-feature-ctp5-part-6 -loading-related-entities.aspx

于 2012-07-12T22:27:54.997 回答
0

它可能已经过时,但我想这是您正在寻找的答案:

public abstract class YourContext : DbContext
{
  public YourContext()
  {
    (this as IObjectContextAdapter).ObjectContext.ContextOptions.UseCSharpNullComparisonBehavior = true;
  }
}

这应该可以解决您的问题,因为 Entity Framerwork 将使用“C#like”空比较。

于 2013-03-19T19:50:15.560 回答
0

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在调试器窗口(或从代码访问)中查看属性时,您将在那里获得数据。

于 2012-11-28T14:32:08.910 回答