C#错误:LINQ to实体无法识别该方法

C#错误:LINQ to实体无法识别该方法,c#,linq-to-entities,C#,Linq To Entities,在测试运行报告时,我收到以下错误: LINQ to Entities无法识别方法“System.Decimal PerformCurrencyConversion(System.Decimal,System.Decimal,System.Decimal,System.String,System.DateTime)”方法,并且无法将此方法转换为存储表达式 我的问题是: List<BusinessPlanningElements> productSales = (from sale in

在测试运行报告时,我收到以下错误:

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();
在整个代码库中,我已经多次使用这种方法,没有遇到任何问题或错误,例如

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();
List monthlyProductSales=(来自productSales中的sale
orderby sale.datesalled
按新{sale.datesalled.Month,sale.Product.Name}将销售分组到ds中
选择新的MonthlyProductSales
{
Name=ds.Select(it=>it.Product.Name).FirstOrDefault(),
Month=ds.Select(it=>it.datesell.Month).FirstOrDefault(),
Year=ds.Select(it=>it.datesell.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)、0、0、0、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();

有人能看出区别是什么吗?或者我该如何避免这个错误

区别在于LINQ实现

在第一个代码示例中,您使用的是LINQ to Entities(即实体框架的LINQ实现)。此实现将LINQ转换为SQL,最终在数据库上执行

在第二个代码示例中,您使用的是LINQ to对象(即内存中的集合)。此实现不会转换为SQL或其他语言,而是简单地创建在内存集合上执行的操作链。因此,LINQ的这个实现可以使用.NET函数,例如
PerformCurrencyConversion


因此,您可以首先使用LINQ to Entities查询数据库,并将结果存储在数组或列表中,然后在该数组或列表上执行LINQ to Objects查询,然后您可以使用内置的.NET函数。

使用LINQ to Entities或LINQ to Objects的工作代码是吗?@AmiramKorach,它在标记中。
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();