web-dev-qa-db-ja.com

マテリアライズされた「System.Int32」型から「System.Double」型への指定されたキャストは無効です

次のクエリを実行すると、エラーが発生します。

マテリアライズされた「System.Int32」型から「System.Double」型への指定されたキャストは無効です。

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

WorkDayOnDutyDay、およびHolidayのデータ型はdoubleです。ここにはInt32がないので、なぜこのエラーが発生するのですか?

このエラーを解決するにはどうすればよいですか?

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

データベーステーブル内の列のデータ型はInt32ですが、データモデルにはdoubleがあります。データモデルのデータ型をintに変更する必要があります。 materializedとは、データベースでクエリを実行したときに取得した型を意味します。

53
yohannes07

最初に、モデルとテーブルの列のデータ型が同じであることを確認してください。

クエリをこれに変更してみてください。

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

コレクションが空の場合、値が0の要素が1つ返され、合計が適用されます。

2
Ajay P