在我的C# 类库项目中,我有一个需要计算一些统计数据的方法GetFaultRate
,给定 a date
,计算有故障的产品数量超过生产的产品数量。
float GetFaultRate(DateTime date)
{
var products = GetProducts(date);
var faultyProducts = GetFaultyProducts(date);
var rate = (float) (faultyProducts.Count() / products.Count());
return rate;
}
两种方法,GetProducts
并GetFaultyProducts
从Repository类中获取数据_productRepository
。
IEnumerable<Product> GetProducts(DateTime date)
{
var products = _productRepository.GetAll().ToList();
var periodProducts = products.Where(p => CustomFunction(p.productionDate) == date);
return periodProducts;
}
IEnumerable<Product> GetFaultyProducts(DateTime date)
{
var products = _productRepository.GetAll().ToList();
var periodFaultyProducts = products.Where(p => CustomFunction(p.ProductionDate) == date && p.Faulty == true);
return periodFaultyProducts;
}
哪里GetAll
有签名:
IQueryable<Product> GetAll();
数据库中的产品很多,检索和转换需要很长时间ToList()
。我需要枚举该集合,因为任何自定义函数(例如CustomFunction
、 )都无法在IQueryable<T>
.
我的应用程序在获得故障率之前卡了很长时间。我想这是因为要检索的对象数量很大。我确实可以删除这两个函数GetProducts
并GetFaultyProducts
实现里面的逻辑GetFaultRate
。但是,由于我还有其他使用GetProducts
and的函数,因此使用GetFaultyProducts
后一种解决方案,我只能访问数据库,但有很多重复的代码。
什么是好的妥协?