レポートの実行をテストしているときに、次のエラーが表示されます。
LINQ to Entities はメソッド 'System.Decimal PerformCurrencyConversion(System.Decimal, System.Decimal, System.Decimal, System.String, System.DateTime)' メソッドを認識せず、このメソッドはストア式に変換できません。
これが私のクエリです:
List<BusinessPlanningElements> productSales = (from sale in ctn.ProductSales
where sale.DateSold.Year == reportRequest.Year && sale.ProductID == t.ProductID
group sale by sale.DateSold.Month into ds
select new BusinessPlanningElements
{
Month = ds.Select(it => it.DateSold.Month).FirstOrDefault(),
EURNumberOfUnitSold = ds.Where(it => it.EURSales.HasValue).Where(it => it.EURSales != 0).Count(),
GBPNumberOfUnitSold = ds.Where(it => it.GBPSales.HasValue).Where(it => it.GBPSales != 0).Count(),
USDNumberOfUnitSold = ds.Where(it => it.USDSales.HasValue).Where(it => it.USDSales != 0).Count(),
EURCumulativeNumberOfUnitsSold = ctn.ProductSales.Where(it => it.EURSales.HasValue && it.EURSales != 0 && it.ProductID == t.ProductID && it.DateSold.Month <= ds.Key).Count(),
GBPCumulativeNumberOfUnitsSold = ctn.ProductSales.Where(it => it.GBPSales.HasValue && it.GBPSales != 0 && it.ProductID == t.ProductID && it.DateSold.Month <= ds.Key).Count(),
USDCumulativeNumberOfUnitsSold = ctn.ProductSales.Where(it => it.USDSales.HasValue && it.USDSales != 0 && it.ProductID == t.ProductID && it.DateSold.Month <= ds.Key).Count(),
USDTotalSales = PerformCurrencyConversion(ds.Sum(it => it.USDSales.HasValue ? it.USDSales.Value : 0), 0M, 0M, reportRequest.Currency, DateTime.Now.AddMonths(-2)),
GBPTotalSales = PerformCurrencyConversion(0M, ds.Sum(it => it.GBPSales.HasValue ? it.GBPSales.Value : 0), 0M, reportRequest.Currency, DateTime.Now.AddMonths(-2)),
EURTotalSales = PerformCurrencyConversion(0M, 0M, ds.Sum(it => it.EURSales.HasValue ? it.EURSales.Value : 0), reportRequest.Currency, DateTime.Now.AddMonths(-2)),
USDCumulativeTotalSales = PerformCurrencyConversion(ctn.ProductSales.Sum(it => it.USDSales.HasValue && it.USDSales != 0 && it.ProductID == t.ProductID && it.DateSold.Month <= ds.Key ? it.USDSales.Value : 0), 0M, 0M, reportRequest.Currency, DateTime.Now.AddMonths(-2)),
GBPCumulativeTotalSales = PerformCurrencyConversion(ctn.ProductSales.Sum(it => it.GBPSales.HasValue && it.GBPSales != 0 && it.ProductID == t.ProductID && it.DateSold.Month <= ds.Key ? it.GBPSales.Value : 0), 0M, 0M, reportRequest.Currency, DateTime.Now.AddMonths(-2)),
EURCumulativeTotalSales = PerformCurrencyConversion(ctn.ProductSales.Sum(it => it.EURSales.HasValue && it.EURSales != 0 && it.ProductID == t.ProductID && it.DateSold.Month <= ds.Key ? it.EURSales.Value : 0), 0M, 0M, reportRequest.Currency, DateTime.Now.AddMonths(-2)),
}).ToList();
PerformCurrencyConversion メソッドは、ほとんど換算レートのリストを取得し、その値をユーザーが指定した通貨に変換します。次のようなパラメーターを受け入れます。
public decimal PerformCurrencyConversion(decimal usd, decimal gbp, decimal eur, string Currency, DateTime saleMonth)
{
//Logic
}
私は過去にこの方法をコードベース全体で何度か使用しましたが、問題やエラーはありませんでした。
List<MonthlyProductSales> monthlyProductSales = (from sale in productSales
orderby sale.DateSold descending
group sale by new { sale.DateSold.Month, sale.Product.Name } into ds
select new MonthlyProductSales
{
Name = ds.Select(it => it.Product.Name).FirstOrDefault(),
Month = ds.Select(it => it.DateSold.Month).FirstOrDefault(),
Year = ds.Select(it => it.DateSold.Year).FirstOrDefault(),
USDNumberItemsSold = ds.Where(it => it.USDSales.HasValue).Where(it => it.USDSales != 0).Count(),
GBPNumberItemsSold = ds.Where(it => it.GBPSales.HasValue).Where(it => it.GBPSales != 0).Count(),
EURNumberItemsSold = ds.Where(it => it.EURSales.HasValue).Where(it => it.EURSales != 0).Count(),
USDRevenueTotal = PerformCurrencyConversion(ds.Sum(it => it.USDSales.HasValue ? it.USDSales.Value : 0), 0M, 0M, reportRequest.Currency, DateTime.Now.AddMonths(-2)),
GBPRevenueTotal = PerformCurrencyConversion(0M, ds.Sum(it => it.GBPSales.HasValue ? it.GBPSales.Value : 0), 0M, reportRequest.Currency, DateTime.Now.AddMonths(-2)),
EURRevenueTotal = PerformCurrencyConversion(0M, 0M, ds.Sum(it => it.EURSales.HasValue ? it.EURSales.Value : 0), reportRequest.Currency, DateTime.Now.AddMonths(-2)),
}).ToList();
違いが何であるか、またはこのエラーを回避する方法を誰でも見ることができますか?