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 方法。
欢迎任何意见或建议。
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)
查询在您的数据库上执行并返回标量结果。
| 归档时间: |
|
| 查看次数: |
163 次 |
| 最近记录: |