如果想要使用EF导航(按类的属性导航),List<T>
的内容都将在内存中处理。
例如,我有这个EF模型类:
class School
{
public virtual ICollection<Groups> Groups { get; set; }
...
public School()
{
this.Courses = new List<Group>(); // List<T>!!
}
}
如果我这样做:
someSchool.Groups.Count
我将计算内存中的组而不是SQL中的组(即:这些组不会像"select count(*) from Groups join School Where SchoolId = ..."
那样计算)
所以我的问题是.. 我应该使用什么而不是List?
IEnumerable是一个接口,所以我不能拥有一个新的IEnumerable,...也可以。也可以。
如果没有集合类适合这个,那么我想我应该使用我的DbContext实例。像这样:
(new MyDbContext()).Groups.Count(g => g.SchoolId == ...)
如果是这样的话,那么:为什么有EF导航?!??
修改
好吧也许我应该使用真实的信息:
我已经在使用ICollection(我在帖子中使用了IEnumerable,因为我认为它们类似)
这是一个慢查询:domain.Persons.Count(p => p.IsStudent && p.GuardianId != null && p.Guardian.Mobile.Equals(""))
这是快速查询:db.Persons.Count(p => p.Domains.Any(d => d.DomainId == domain.DomainId) && p.IsStudent && p.GuardianId != null && p.Guardian.Mobile.Equals(""))
如您所见,2和3非常相似......一个使用导航而另一个不使用。
答案 0 :(得分:1)
您应该使用ICollection<T>
并将属性定义为虚拟,以便您可以延迟加载并获取Count()。
// Example
public virtual ICollection<Apple> Apples{get;set;}
virtual
关键字使EF能够在您访问getter时覆盖其行为和延迟加载实体。