12

データベーステーブルTransaction(transactionID、LocalAmount ...)があります。ここで、Localamountプロパティのデータ型はfloatです。UIで、ボタンクリックイベントの1行に列の合計(Localamount)返そうとしています。

floatの代わりにdecimalを使用しました

ただし、 10進数にキャストしているコードでエラーが発生します

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.

The

 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についての私の知識が些細なものである場合は、すみません。

4

4 に答える 4

12

Entity Frameworkは、希望する変換をサポートしていないことを示しています。回避策の1つは、データベースでできるだけ多くの作業を実行してから、メモリ内でプロセスを完了することです。あなたの場合、ネイティブ型で合計を計算し、その結果を匿名型としてメモリにプルし、実際に必要な型を構築するときに変換を実行できます。元のクエリを取得するには、次の変更を加えることができます。

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();
于 2013-02-18T16:11:38.620 に答える
7

AsEnumerableを呼び出す余裕がない場合は、int数学を使って10進数に変換することができます。

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

各ゼロは、実際には変換の精度を表します。

これからこの答えを得ました。ファイルの終わりを見てください。

于 2018-12-14T21:39:36.573 に答える
1

クエリが終了した後にキャストすることをお勧めします

var somevar = (decimal)transactions.YourValue
于 2013-02-18T15:48:53.227 に答える
1

10進数の宮殿が2つ以上ある場合は、キャストが必要になることがあります

     double TotalQty;
     double.TryParse(sequence.Sum(x => x.Field<decimal>("itemQty")).ToString(),out TotalQty);
于 2016-01-21T07:19:04.110 に答える