【问题标题】:Full outer join: The cast to value type 'System.Int32' failed because the materialized value is null完全外部联接:转换为值类型“System.Int32”失败,因为具体化值为 null
【发布时间】:2019-12-13 09:55:02
【问题描述】:

我正在尝试像这样在 C# 中进行完全外部联接。

var LeftOuterJoin = from h in db.WorkingHoursPerProject
                                join t in db.Timesheets 
                                on new { IDProject = h.IDProject, Username = h.Username, Year = h.Date.Year, Month = h.Date.Month} equals
                                   new { IDProject = t.IDProject, Username = t.Username, Year = t.Date.Year, Month = t.Date.Month}
                                into temp
                                from t in temp.DefaultIfEmpty()
                                select new EmployeeProjectWorkingHours {
                                    IDProject = h.IDProject,
                                    Username = h.Username,
                                    Year = h.Date.Year,
                                    Month = h.Date.Month,
                                    HoursPlanned = h.HoursPlanned ?? default(decimal),
                                    HoursSpent = t.WorkHours ?? default(decimal)
                                };

var RightOuterJoin = from t in db.Timesheets
              join h in db.WorkingHoursPerProject
                                 on new { IDProject = t.IDProject, Username = t.Username, Year = t.Date.Year, Month = t.Date.Month } equals
                                   new { IDProject = h.IDProject, Username = h.Username, Year = h.Date.Year, Month = h.Date.Month } 
                                 into temp
                                 from h in temp.DefaultIfEmpty()
                                 select new EmployeeProjectWorkingHours {
                                     IDProject = h.IDProject,
                                     Username = h.Username,
                                     Year = h.Date.Year,
                                     Month = h.Date.Month,
                                     HoursPlanned = h.HoursPlanned ?? default(decimal),
                                     HoursSpent = t.WorkHours ?? default(decimal)
                                 };

var result = LeftOuterJoin.Union(RightOuterJoin).ToList();

我不断收到以下错误: 转换为值类型“System.Int32”失败,因为具体化值为 null。结果类型的泛型参数或查询必须使用可为空的类型。

所有 int 属性都不能为空。有人可以帮我解决这个问题吗?

【问题讨论】:

  • 我没有读过你的查询,但如果是外连接,我猜有时找不到匹配的行,所以该列的数据库结果是nullThis question might help 虽然我不使用实体框架/LINQ 查询语法,所以我可能错了。

标签: c# linq


【解决方案1】:

如果您要返回值类型,并且该值可能丢失,则需要将其强制转换为 Nullable 以便 linq / 实体框架返回正确的值。例如IDProject = (int?)h.IDProject

【讨论】:

    【解决方案2】:

    在您使用的第二个查询中,选择新的 EmployeeProjectWorkingHours h 来自 DefaultIfEmpty。 h为空怎么办?因此我认为 IDProject、用户名、年份、月份必须从 t 而不是从 h 分配值。

    【讨论】:

      猜你喜欢
      • 2015-07-20
      • 1970-01-01
      • 2016-08-02
      • 1970-01-01
      • 1970-01-01
      • 2013-02-24
      • 2013-06-18
      相关资源
      最近更新 更多