C# 实体框架:计算集合中的元素数<;T>;(表演)

C# 实体框架:计算集合中的元素数<;T>;(表演),c#,entity-framework,C#,Entity Framework,我的代码优先模型中有一个集合属性: public class Advertisment { //... public ICollection<Comment> Comments {get; set;} } 我的问题是关于性能。第二种方法看起来更易于开发,但是,在这种情况下,实体框架确实会对数据库中的元素进行计数。这对绩效有负面影响吗 db.Comments.Count() 如果您查询了数据,EF将统计本地实例的数据 所以你有两种可能: 您已经查询了数据: 因此EF只使用IEn

我的代码优先模型中有一个集合属性:

public class Advertisment
{
//...
  public  ICollection<Comment> Comments {get; set;}
}
我的问题是关于性能。第二种方法看起来更易于开发,但是,在这种情况下,实体框架确实会对数据库中的元素进行计数。这对绩效有负面影响吗

db.Comments.Count()
如果您查询了数据,EF将统计本地实例的数据

所以你有两种可能:

  • 您已经查询了数据:
    因此EF只使用
    IEnumerable
    元素的方法
  • 您尚未查询数据:
    EF将查询数据,然后使用
    1中的方法。
  • =>EF仅在需要时查询数据

    =>通过使用
    db.Comments.Count(),我看不到任何缺点


    编辑:

    当您在表上使用
    Linq
    表达式时,也会发生同样的情况,如中所示:

    db.Comments.Where(c => c.Advertisment == this).Count();
    
    但是每次使用这一行时都必须应用
    Linq
    过滤器,但只能在数据库的本地实例上应用


    Q:在我的场景中,我只需要注释的数量,即EF不查询集合导航属性(不急于加载)。我认为在我的情况下,只使用单个字段(IntNumberOfComments)比EF查询额外数据进行计数更好。我错了吗

    A:如果您只有一个服务器实例在运行,那么您是对的,但是如果有多个实例,则会出现数据不一致的情况。EF上下文对象不是设计为长寿命对象的。请参阅本文的评论:

    数据上下文不是设计为长期存在的。在多个操作中重用它是设计中的一个错误。(挥霍者)


    即:在负载平衡方面,您有两台服务器运行相同的应用程序。如果一个注释将发送到一台服务器,那么另一台服务器如何在不计算注释的情况下增加注释标志?

    comments.Count不调用实体上下文。它将只统计本地列表中的实例。假设您的实体上下文是namned db,那么db.Comments.Count将对该上下文发出请求。@Marcus H,我已编辑,谢谢
    public int SumComments()
    {
    return db.Comments.Where(c => c.Advertisment == this).Count(); //where db is instance of DbContext
    }
    
    db.Comments.Where(c => c.Advertisment == this).Count();