En exécutant la requête suivante, j'obtiens l'erreur:
La conversion spécifiée d'un type 'System.Int32' matérialisé vers le type 'System.Double' n'est pas valide.
var data = ctx.tblTO
.Where(m => m.Id == Id)
.GroupBy(m => m.EmployeeId)
.Select(m => new
{
workDay = m.Sum(k => k.WorkDay),
onDutyDay = m.Sum(k => k.OnDutyDay),
holiDay = m.Sum(k => k.Holiday)
})
.FirstOrDefault();
Le type de données de WorkDay
, OnDutyDay
et Holiday
est double
. Il n'y a pas Int32
ici, alors pourquoi ai-je cette erreur?
Comment puis-je résoudre cette erreur?
public class TO
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public int EmployeeId { get; set; }
public double WorkDay { get; set; }
public double OnDutyDay { get; set; }
public double Holiday { get; set; }
}
Je pense que le type de données des colonnes de votre table de base de données est Int32
mais votre modèle de données a double
. Vous devez modifier les types de données de vos modèles de données en int
. Par materialized
, il s'agit du type obtenu lors de l'exécution de la requête sur la base de données.
Vérifiez d’abord que le type de données de votre modèle et celui de la colonne de la table sont identiques.
Essayez de changer votre requête à ceci.
var data = ctx.tblTO
.Where(m => m.Id == Id)
.GroupBy(m => m.EmployeeId)
.Select(m => new
{
workDay = m.Select(k => k.WorkDay).DefaultIfEmpty(0).Sum(),
onDutyDay = m.Select(k => k.OnDutyDay).DefaultIfEmpty(0).Sum(),
holiDay = m.Select(k => k.Holiday).DefaultIfEmpty(0).Sum()
})
.FirstOrDefault();
Si la collection est vide, il retournera un élément avec la valeur 0 et la somme sera appliquée.