Sto cercando di risolvere un problema che ho con l'estrazione di grandi intro (22+ cifre) in ASP.Net con Entity Framework Core da un database MySQL.
EF Core non supporta BigInteger
e i suggerimenti che ho ricevuto in cui invece utilizzare decimal
. Tuttavia, quando si utilizzano decimal
tipi decimal
sulle mie entità, ricevo sempre la seguente eccezione quando provo a selezionare dal DB:
System.InvalidCastException: impossibile eseguire il cast dell'oggetto di tipo 'System.Int32' per digitare 'System.Decimal'
Nel Database le colonne sono INT(25)
e nei miei modelli il tipo è decimal
, ecco un esempio di modello:
[Table("alliance_reputation_rankings")]
public class AllianceReputationRank
{
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
[Column("date")]
public DateTime Date { get; set; }
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
[Column("world")]
public int World { get; set; }
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
[Column("alliance")]
public string Alliance { get; set; }
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
[Column("rank")]
public int Rank { get; set; }
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
[Column("reputation")]
public decimal Reputation { get; set; }
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
[Key]
[Column("entry_id")]
public int EntryId { get; set; }
}
Non riesco a selezionare la proprietà Reputation
usando EF Core. Anche se provo e uso (decimal)
prima della proprietà per lanciarlo:
Esempio approssimativo di selezione:
_context.AllianceReputationRankings
.Where(p => p.Date == rank.Date && p.Alliance== rank.Alliance && p.World == rank.World)
.Select(pl => new AllianceReputationRank
{
Date = pl.Date,
World = pl.World,
Alliance = pl.Alliance,
Reputation = (decimal)pl.Reputation
}
).FirstOrDefault();
Come posso usare i decimali nei miei modelli per inserire grandi quantità di dati dal database? Se non riesco a utilizzare i decimali, come posso utilizzare numeri grandi con EF Core?
Quello che ho fatto sembra funzionare è moltiplicare per 1m
:
context.AllianceReputationRankings
.Where(p => p.Date == rank.Date && p.Alliance== rank.Alliance && p.World == rank.World)
.Select(pl => new AllianceReputationRank
{
Date = pl.Date,
World = pl.World,
Alliance = pl.Alliance,
Reputation = pl.Reputation * 1m
}
).FirstOrDefault();
Ciò sembra consentire operazioni decimali mentre non si prendono le prestazioni sul pavimento.