私の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
ます。ただし、GetProducts
andを使用する他の関数があるためGetFaultyProducts
、後者のソリューションでは、データベースへのアクセスは 1 回だけですが、多くの重複コードがあります。
良い妥協点は何ですか?