在我的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。但是,由于我还有其他使用GetProductsand的函数,因此使用GetFaultyProducts后一种解决方案,我只能访问数据库,但有很多重复的代码。
什么是好的妥协?