我正在使用Entity Framework CodeFirst,其中我使用了ICollection作为父子关系的集合类型。
public class Person
{
public string UserName { get;set}
public ICollection<Blog> Blogs { get; set;}
}
public class Blog
{
public int id { get; set; }
public string Subject { get; set; }
public string Body { get; set; }
}
好的,到目前为止一切都运行良好,但我的担忧是,每当我想要获取一个人的博客时,我得到的结果是
var thePerson = _context.Persons.Where(x => x.UserName = 'xxx').SingleOrDefault();
var theBlogs = thePerson.Blogs.OrderBy(id).Take(5);
现在,我理解当该行代码被执行时,该人的所有博客都会被加载到内存中,然后从内存中进行排序和选择。对于具有大量博客的人来说,这并不理想。我希望将Blog Child声明为IQueryable,以便在将其拉入内存之前,在SQL数据库中进行排序和选择。
我知道我可以在我的上下文中将Blogs声明为IQueryable,这样我就可以直接查询:
var theBlogs = _context.Blogs.Where(.....)
但由于设计选择,这对我来说不可行,我希望尽可能避免循环引用,以避免序列化问题。因此,在我的子级中没有对父实体做任何引用。
我发现,我可以在博客上调用AsQueryable()方法:
var theBlogs = thePerson.Blogs.AsQueryable().OrderBy(id).Take(5);
对我来说,这看起来像是一种魔法,似乎太好了。所以我的问题是,AsQueryable是否真正将ICollection转换为IQueryable,并使所有查询过程在SQL Server中处理(延迟加载),还是只是进行强制类型转换,但Blogs仍然像以前一样被加载到内存中,但接口从ICollection更改为IQueryable?