Кастинг в десятичном формате не поддерживается в запросах 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)
Каждый ноль фактически представляет точность, которую будет иметь преобразование.
Получил этот ответ от этого. Просто взгляните на конец файла.