2013-02-18 7 views
8

Mam transakcji tabeli bazy danych (transactionID, LocalAmount ...). gdzie typem danych dla właściwości Localamount jest float. W interfejsie próbuję zwrócić SUMA kolumny (Localamount) w jednym wierszu zdarzenia kliknięcia przycisku.Przesyłanie na dziesiętne nie jest obsługiwane w kwerendach LINQ do jednostek Entry

Użyłem dziesiętny zamiast pływak

Jednak ja otrzymuję błąd w kodzie, gdzie jestem odlewania do dziesiętnych

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; 

    } 

Próbowałem kilka opcji następujące posty, ale bez powodzenia.

Czy ktoś może wskazać, jakie inne opcje mogą się staram. Przepraszam moją małą wiedzę na temat LINQ, jeśli jest zbyt trywialna.

Odpowiedz

10

Entity Framework jest wskazaniem, że nie obsługuje konwersję pragnienie. Jednym z rozwiązań jest po prostu wykonanie jak największej części pracy w bazie danych, a następnie ukończenie procesu w pamięci. W twoim przypadku możesz obliczyć sumę w swoim rodzimym typie, przenieść wynik do pamięci jako typ anonimowy, a następnie wykonać konwersję podczas konstruowania typu, którego faktycznie potrzebujesz. Aby wziąć oryginalnego zapytania, można wprowadzić następujące zmiany:

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

To wydaje się wykonalne, ale pojawia się błąd {"Określona obsada od zmaterializowanego typu" System.Decimal "do typu" System.Double "jest niepoprawna."}. Dzieje się tak dlatego, że klasa Model dla transakcji zawiera podwójne dla właściwości LocalAmount i AmountInEuro, które ręcznie zmieniłem, ale następnie daje kolejny błąd typu "Edm.Double" członka "LocalAmount" w koncepcyjnym typie strony "CostReportModel.Transaction" nie pasuje do typu "System.Decimal" elementu "LocalAmount" w typie obiektu po stronie "CostReportModel.Transaction". – shaz

+0

Niestety, są to oddzielne problemy z tego zapytania. Wygląda na to, że ty (lub ktoś z twojego zespołu) bawił się z twoimi istotami, co może być niebezpieczne. Możesz potrzebować osobnego, ** nowego ** pytania na temat bezpiecznej zmiany typów w modelu danych jednostki. –

+0

Problem polega na tym, że jako pierwszy typ danych wprowadziłem w DB (brak wiedzy), a następnie zmieniono je na dziesiętne (ponieważ miałem problem z formatowaniem). Jednak model został wygenerowany automatycznie przez EF z float na double.Czy dobrze byłoby generować klasy jednostek, aby wypróbować to rozwiązanie? – shaz

1

Proponuję zrobić obsadę po zapytanie zakończy

var somevar = (decimal)transactions.YourValue 
+0

ale jestem tylko za pomocą dwóch kolumn z tabeli transakcji, które są LocalAmount i AmountInEUR i są zmiennoprzecinkowe w bazie danych, ale dziesiętnie w klasie ViewModel. Transakcje muszą być konwertowane przy użyciu metody .ToList(), ponieważ metoda zwraca listę <>. Czy w takim przypadku mogę zastosować Twoją sugestię? Nie bardzo rozumiałem, jak bym to zrobił. – shaz

1

czasami trzeba casting, jeśli więcej niż dwa pałace dziesiętne

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