Linq - la distribution spécifiée d'un type 'System.Int32' matérialisé vers le ' System.Double' n'est pas valide

Lors de l'exécution de la requête suivante, j'obtiens l'erreur: -

La distribution spécifiée à partir d'un type 'System.Int32' matérialisé "Système.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, Holiday est double. Il n'y a pas de Int32 ici, alors pourquoi j'obtiens cette erreur?

Comment 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; }
}
29
demandé sur tereško 2015-08-28 09:09:14

2 réponses

Je pense que le type de données des colonnes dans 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 cela signifie le type qu'il a obtenu quand il a exécuté la requête sur la base de données.

38
répondu Yohannis 2015-08-28 06:31:08

Assurez-vous D'abord que votre modèle et votre type de données de colonne de table sont identiques.

Essayez de changer votre requête en 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, elle retournera un élément avec la valeur 0 et la somme sera appliquée.

1
répondu Ajay Punekar 2015-08-28 06:25:28