使用实体框架v5.0RC使用空对象的子句

时间:2012-07-12 18:42:29

标签: entity-framework entity-framework-4 linq-to-entities entity-framework-4.1

我试图做以下

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

然而,无论我尝试什么,这都不会返回结果,即使我可以在集合中看到ALL 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;
    }

3 个答案:

答案 0 :(得分:0)

如果查询...

_context.Category
        .Where(x => x.ParentCategory == null)
        .OrderBy(x => x.SortOrder)
        .ToList()

...返回一个空集合,这意味着数据库中的所有类别都有ParentCategory或者categories表为空。就是这样。

在此查询的结果集合中的事实......

_context.Category
        .OrderBy(x => x.SortOrder)
        .ToList()

...每个类别都没有ParentCategory并不能证明数据库中的每个类别都没有ParentCategory

您是否了解使用EF加载或不加载相关实体的基础知识?我建议阅读EF&gt; = 4.1 / DbContexthttp://blogs.msdn.com/b/adonet/archive/2011/01/31/using-dbcontext-in-ef-feature-ctp5-part-6-loading-related-entities.aspx

的这篇介绍

答案 1 :(得分: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属性(或从代码访问)时,那里有数据。

答案 2 :(得分:0)

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

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

这可以解决您的问题,因为实体Framerwork将使用'C#like'null comparison。