次のクエリを実行すると、エラーが発生します。
マテリアライズされた「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();
WorkDay
、OnDutyDay
、および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; }
}
データベーステーブル内の列のデータ型はInt32
ですが、データモデルにはdouble
があります。データモデルのデータ型をint
に変更する必要があります。 materialized
とは、データベースでクエリを実行したときに取得した型を意味します。
最初に、モデルとテーブルの列のデータ型が同じであることを確認してください。
クエリをこれに変更してみてください。
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つ返され、合計が適用されます。