私のC# クラス ライブラリ プロジェクトには、いくつかの統計を計算する必要があるメソッドがありますGetFaultRate。これは、 が与えられたdate場合、生産された製品の数に対して障害のある製品の数を計算します。
float GetFaultRate(DateTime date)
{
var products = GetProducts(date);
var faultyProducts = GetFaultyProducts(date);
var rate = (float) (faultyProducts.Count() / products.Count());
return rate;
}
どちらのメソッドも、リポジトリクラスからデータを取得しGetProductsます。 GetFaultyProducts_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>ます。
障害率を取得する前に、アプリケーションが長時間停止します。取得するオブジェクトの数が多いためだと思います。実際に 2 つの関数GetProductsを削除して、GetFaultyProducts内部にロジックを実装できGetFaultRateます。ただし、GetProductsandを使用する他の関数があるためGetFaultyProducts、後者のソリューションでは、データベースへのアクセスは 1 回だけですが、多くの重複コードがあります。
良い妥協点は何ですか?