Кастинг в десятичном формате не поддерживается в запросах LINQ to Entities

У меня есть таблица базы данных Transaction (transactionID, LocalAmount...). где тип данных для свойства Localamount - float. В пользовательском интерфейсе я пытаюсь вернуть СУММУ столбца (Localamount) в одной строке при событии нажатия кнопки.

Я использовал десятичный вместо float

Однако я получаю сообщение об ошибке в коде, в котором я использую десятичный

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, если это слишком тривиально.

Ответ 1

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

Ответ 2

Я предлагаю вам сделать бросок после завершения вашего запроса

var somevar = (decimal)transactions.YourValue

Ответ 3

Иногда требуется кастинг, если более двух десятичных дворцов

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

Ответ 4

Если вам не хватает роскоши вызывать AsEnumerable, вы можете преобразовать его в int а затем в десятичную с некоторой математикой.

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

Каждый ноль фактически представляет точность, которую будет иметь преобразование.

Получил этот ответ от этого. Просто взгляните на конец файла.