如何使用 EntityFramework 有效地计算表中存在的项目数?

Fab*_*omo 0 c# sql entity-framework count tolist

我有一个 C# 项目,其中几个项目存储在不同的表中,例如,为了计算一个表包含多少个元素,我执行了类似于以下操作:

public int getLengthListProducts(int idCompany)
{
  try
  {
      using (var context = new ccoFinalEntities())
      {
        return context.products.Where(p => true == p.status && idCompany == p.idCompany).ToList().Count;
      }
  }
  catch
  {
    return -1;
  }
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,它运行得很好,但是当数量开始达到 1000 件时,在某些 PC 上开始需要一段时间才能获得这个数字。

我怀疑 context.products 将所有项目放在 RAM 中,然后开始提取和计算满足以下条件的项目,这就是应用程序被冻结直到计数完成的原因。

我的问题是:有没有办法做得更好?

例如,我认为我应该直接使用 SQL 语句而不是使用 EntityFramework 来获取该数字,但我不知道这是否是一个好主意,或者是否有更有效的 EntityFramework 方法。

欢迎任何意见或建议。

Orw*_*wel 6

context.products.Where(p => true == p.status && idCompany == p.idCompany).ToList().Count;
Run Code Online (Sandbox Code Playgroud)

在此 Linq 查询中,ToList()将生成 SQL 查询:

SELECT ...
FROM Products
WHERE status = 1 and idCompagny = @idCompany
Run Code Online (Sandbox Code Playgroud)

此查询在您的数据库上执行,并且可以返回很多行。所有元素都加载到 .Net Collection 中的客户端内存中并Count返回最终结果。

使用实体框架,您可以使用聚合 Linq 查询 (Count, Sum, Avg, ...) :

https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/linq/aggregate-queries

例子 :

context.products.Where(p => true == p.status && idCompany == p.idCompany).Count();
Run Code Online (Sandbox Code Playgroud)

Count() 将生成 SQL 查询:

SELECT COUNT(*)
FROM Products
WHERE status = 1 and idCompagny = @idCompany
Run Code Online (Sandbox Code Playgroud)

查询在您的数据库上执行并返回标量结果。

  • 可以缩写为: context.products.Count(p => true == p.status && idCompany == p.idCompany); (4认同)