包含集合的EF类:列表导致在导航时使用内存

时间:2013-12-02 15:28:42

标签: entity-framework

如果想要使用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导航?!??




修改 好吧也许我应该使用真实的信息:

  1. 我已经在使用ICollection(我在帖子中使用了IEnumerable,因为我认为它们类似)

  2. 这是一个慢查询:domain.Persons.Count(p => p.IsStudent && p.GuardianId != null && p.Guardian.Mobile.Equals(""))

  3. 这是快速查询:db.Persons.Count(p => p.Domains.Any(d => d.DomainId == domain.DomainId) && p.IsStudent && p.GuardianId != null && p.Guardian.Mobile.Equals(""))

  4. 如您所见,2和3非常相似......一个使用导航而另一个不使用。

1 个答案:

答案 0 :(得分:1)

您应该使用ICollection<T>并将属性定义为虚拟,以便您可以延迟加载并获取Count()。

// Example
public virtual ICollection<Apple> Apples{get;set;}

virtual关键字使EF能够在您访问getter时覆盖其行为和延迟加载实体。