0

レポートの実行をテストしているときに、次のエラーが表示されます。

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();

違いが何であるか、またはこのエラーを回避する方法を誰でも見ることができますか?

4

1 に答える 1

2

違いは、LINQ の実装にあります。

最初のコード サンプルでは、​​LINQ to Entities (Entity Framework の LINQ 実装) を使用しています。この実装により、LINQ が SQL に変換され、最終的にデータベースで実行されます。

2 番目のコード サンプルでは、​​LINQ to Objects (つまり、インメモリ コレクション) を使用しています。この実装は、SQL や別の言語に変換されませんが、メモリ内コレクションで実行される一連のアクションを作成するだけです。したがって、この LINQ の実装では、 などの .NET 関数を使用できますPerformCurrencyConversion

したがって、最初に LINQ to Entities を使用してデータベースにクエリを実行し、結果を配列またはリストに格納してから、その配列またはリストに対して LINQ to Objects クエリを実行します。その後、組み込みの .NET を使用できます。機能。

于 2012-12-04T10:47:45.003 に答える