2015-08-28 13 views
28

Na wykonujące następujące zapytanie, pojawia się błąd: -LINQ - Określony oddanych od zmaterializowanej typu „System.Int32” do typu „System.Double” nie jest prawidłowy

Podany odlewane z zmaterializowany typ "System.Int32" na typ "System.Double" jest nieprawidłowy.

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

Typ danych WorkDay, OnDutyDay, Holiday jest double. Tutaj nie ma Int32, więc dlaczego mam ten błąd?

Jak rozwiązać ten błąd?

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; } 
} 
+0

Czy możesz dodać model 'tblTO'? –

Odpowiedz

34

myślę typ danych w kolumnach wewnątrz tabeli bazy danych jest Int32 ale model danych ma double. Musisz zmienić typy danych swoich modeli danych na int. Pod numerem materialized oznacza typ, jaki otrzymał, gdy uruchomił zapytanie w bazie danych.

+0

Zgadza się. Zmieniłem bazę danych 'datatype' z' int' na 'float'. Teraz działa dobrze. – Anup

+2

@Anup, mam ten problem. Ale w mojej bazie danych mam float, aw moim modelu również float. Jak mogę zrobić, aby rozwiązać ten problem? Jest to komunikat o błędzie: "System.InvalidOperationException:" Określony rzut od zmaterializowanego typu "System.Single" do typu "System.Double" jest nieprawidłowy. '' – pnet

+0

@pnet, 'float' w sql zawiera 8 bajtów dane, podczas gdy 'float' w świecie .net zawiera 4 bajty danych. Więc możesz użyć "podwójnego" typu danych w swoim kodzie lub możesz użyć 'prawdziwego' typu danych w twojej bazie danych. – Yohannes

1

Najpierw upewnij się, że model i typ danych kolumny tabeli są takie same.

Spróbuj zmienić zapytanie na to.

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

Jeśli kolekcja jest pusta, zwróci jeden element o wartości 0, a następnie zostanie zastosowana suma.

+0

Mam ten problem, ale mój kod nie akceptuje 'MyProperty = m.Select (....)'. Jak mogę zrobić? Wiadomość brzmi: Liberacao nie zawiera definicji "Wybierz" ... – pnet

Powiązane problemy