我试图做以下
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;
}
答案 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 / DbContext
:http://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。