gpt4 book ai didi

c# - Entity Framework : Counting the number of elements in Collection (performance)

转载 作者:行者123 更新时间:2023-11-30 21:48:48 26 4
gpt4 key购买 nike

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

public class Advertisment
{
//...
public ICollection<Comment> Comments {get; set;}
}

其中Comment是other model-class代表广告的评论。我的任务很明显。该程序必须计算评论的数量。有两种方式:

  1. 通过额外的 Int32 字段:

    public ICollection<Comment> Comments {get; set; }
    public int NumberOfComments;
    public void IncrementComments() // call after client leave a comment
    {
    NumberOfComments++;
    }
    public int SumComments() //so, just return the field
    {
    return NumberOfComments;
    }
  2. 通过调用Count方法

    public int SumComments()
    {
    return db.Comments.Where(c => c.Advertisment == this).Count(); //where db is instance of DbContext
    }

    我关于性能的问题。第二种方式看起来更容易开发,但是,在这种情况下, Entity Framework 确实会请求对数据库中的元素进行计数。它对性能有负面影响吗?

最佳答案

db.Comments.Count() 可以发出数据库请求,如果您在初始化 DB-Context 后没有查询过数据。
如果你查询过数据,EF会统计你本地实例的数据。

所以你有两种可能性:

  1. 您已经查询过数据:
    所以 EF 只使用 count() IEnumerable 元素的方法
  2. 您还没有查询过数据:
    EF 将查询数据而不是使用 count()方法如 1.

=> EF 只会在需要时查询数据。

=> 我没有看到使用 db.Comments.Count();

有任何缺点

编辑:

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

db.Comments.Where(c => c.Advertisment == this).Count();

但每次使用此行时都必须应用 Linq 过滤器,但仅限于数据库的本地实例。


问: 在我的场景中,我只需要评论的数量,即 EF 不查询 Collection 导航属性(不是预先加载)。我认为对于我的情况,只使用单个字段 (int NumberOfComments) 比 EF 查询额外的数据进行计数要好。我错了吗?

答: 如果您只有一个服务器实例在运行,那么您是对的,但是如果有多个实例,就会出现数据不一致的情况。 EF 上下文对象并非设计为长期存在的对象,请参阅此帖子的评论:

EntityFramework force globally reload before each query

The data context is not designed to be long-lived. Reusing it over multiple operations is a mistake in your design. (spender)

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

关于c# - Entity Framework : Counting the number of elements in Collection<T> (performance),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37407875/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com