LINQ to Entities查询中不支持强制转换为Decimal

本文关键字:转换 Decimal 不支持 to Entities 查询 LINQ | 更新日期: 2023-09-27 17:59:49

我有一个数据库表Transaction(transactionID,LocalAmount…)。其中LocalAmount属性的数据类型为float。在UI上,我试图在按钮单击事件的一行中返回列(Localamount)的SUM

我使用了十进制而不是浮点

然而,我在代码上得到了一个错误,我正在转换为十进制

System.NotSupportedException was unhandled by user code
Message=Casting to Decimal is not supported in LINQ to Entities queries, because the required precision and scale information cannot be inferred.

 public static IEnumerable<TransactionTotalForProfitcenter> GetTotalTransactionsForProfitcenter(int profitcenterID)
    {
        List<TransactionTotalForProfitcenter> transactions = new List<TransactionTotalForProfitcenter>();
        using (var context = new CostReportEntities())
        {
          transactions = (from t in context.Transactions
                            join comp in context.Companies on t.CompanyID equals comp.CompanyID
                            join c in context.Countries on comp.CountryID equals c.CountryID
                            where c.CountryID.Equals(comp.CountryID) && t.CompanyID == comp.CompanyID 
                             
                            join acc in context.Accounts
                                 on t.AccountID equals acc.AccountID
                            join pc in context.Profitcenters
                                on t.ProfitcenterID equals pc.ProfitcenterID
                            group t by pc.ProfitcenterCode into tProfitcenter
                            
                            select new TransactionTotalForProfitcenter
                            {
                                ProfitcenterCode = tProfitcenter.Key,
                    //the error is occurring on the following line           
                                TotalTransactionAmount = (decimal)tProfitcenter.Sum(t => t.LocalAmount),  
                   //the error is occurring on the following line       
                                TotalTransactionAmountInEUR = (decimal)tProfitcenter.Sum(t => t.AmountInEUR) //the error is occurring on this line 
                            }
                            ).ToList();
        }
        return transactions;
    }

我尝试了以下帖子中的一些选项,但没有成功。

  • LINQ到SQL奇怪的浮点行为
  • 从十进制转换为浮点

有人能指出我可以尝试的其他选择吗。如果LINQ太琐碎,请原谅我对它知之甚少。

LINQ to Entities查询中不支持强制转换为Decimal

Entity Framework表示它不支持您想要的转换。一种解决方法是简单地在数据库中执行尽可能多的工作,然后在内存中完成该过程。在您的情况下,您可以计算其原生类型的总和,将结果作为匿名类型拉入内存,然后在构造实际需要的类型时执行转换。要进行原始查询,您可以进行以下更改:

select new // anonymous type from DB
{
    ProfitcenterCode = tProfitcenter.Key,
    // notice there are no conversions for these sums
    TotalTransactionAmount = tProfitcenter.Sum(t => t.LocalAmount),       
    TotalTransactionAmountInEUR = tProfitcenter.Sum(t => t.AmountInEUR)
})
.AsEnumerable() // perform rest of work in memory
.Select(item =>
     // construct your proper type outside of DB
    new TransactionTotalForProfitcenter
    {
        ProfitcenterCode = item.ProfitcenterCode,
        TotalTransactionAmount = (decimal)item.TotalTransactionAmount
        TotalTransactionAmountInEUR = (decimal)item.TotalTransactionAmountInEUR
    }
).ToList();

如果您没有调用AsEnumerable的奢侈,那么您可以通过一些数学运算将其转换为int和小数。

 (((decimal)((int)(x.Discount * 10000))) / 10000)

每个零实际上代表了转换的精度。

从这里得到了这个答案。看看文件的末尾就知道了。

我建议您在查询完成后进行转换

var somevar = (decimal)transactions.YourValue

如果超过两个十进制宫殿,有时需要铸造

     double TotalQty;
     double.TryParse(sequence.Sum(x => x.Field<decimal>("itemQty")).ToString(),out TotalQty);