【发布时间】:2020-05-04 10:11:09
【问题描述】:
我有一个 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;
}
}
到目前为止,它工作得很好,但是当数量开始为 1000 件时,在某些 PC 上开始需要一段时间才能获得这个数字。
我怀疑 context.products 将所有项目放在 RAM 中,然后开始提取并计算满足以下条件的项目,这就是为什么应用程序在计数完成之前被冻结的原因。
我的问题是:有没有办法做得更好?
例如,我认为我应该直接使用 SQL 语句而不是使用 EntityFramework 来获取该数字,但我不知道这是否是一个好主意,或者 EntityFramework 是否有更有效的方法。
欢迎任何cmets或建议。
【问题讨论】:
-
猜测一下,删除
ToList() -
对于初学者来说,不需要
.Where().ToList().Count。只需使用您的谓词直接调用.Count()。 -
如果你确实需要 ToList() 出于任何其他原因,最好是你做的最后一件事
-
建议:你的
catch有点烂,你为什么要回-1?您的表可能不包含 -1 行。这样所有调用者都需要检查结果-1?如果您无法在此处“修复”异常,则不应在此级别捕获它。
标签: c# sql entity-framework count tolist