web-dev-qa-db-fra.com

La conversion spécifiée d'un type 'System.Int32' matérialisé vers le type 'System.Double' n'est pas valide.

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; }
}
42
Anup

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.

53
yohannes07

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.

2
Ajay P