解决Linq Join Group by 时报错:Nullable object must have a value.
Linq Join Group by 时报Nullable object must have a value.
例如:
                     from s in subject on ch.SubId equals s.SubId
                     join gc in (from aq in question
                                 group aq by aq.ChapterId
                                 into gaq
                                 select new
                                 {
                                     Id = gaq.Key,
                                     Count = gaq.Count(),
                                 })
                     on s.QueId equals gc.Id
                      into gc2
                      from gc in gc2.DefaultIfEmpty()
结果将会报错
生成的sql语句符合预期,为简单的join
解决方法:
	/// <summary>
	///  解决问题: efcore group new dynamic对象时生成int 型而不是 int? 而导致 Nullable object must have a value.的问题
	/// </summary>
	public class GroupTableViewModel
	{
		/// <summary>
		///  Key
		/// </summary>
		public int? Id { get; set; }
		/// <summary>
		/// Count
		/// </summary>
		public int? Count { get; set; }
		/// <summary>
		/// Sum
		/// </summary>
		public int? Sum { get; set; }
        public int? Max { get; set; }
	}
加上 GroupTableViewModel 问题解决
                     from s in subject on ch.SubId equals s.SubId
                     join gc in (from aq in question
                                 group aq by aq.ChapterId
                                 into gaq
                                 select new GroupTableViewModel
                                 {
                                     Id = gaq.Key,
                                     Count = gaq.Count(),
                                 })
                     on s.QueId equals gc.Id
                      into gc2
                      from gc in gc2.DefaultIfEmpty()
解决Join 多值报错
                                from employee in employees
                                join student in students
                                on new { employee.FirstName, employee.LastName } equals new { student.FirstName, student.LastName }
                                select employee.FirstName + " " + employee.LastName;
例如
                                      from u in User
                                      join sac in (from sa in Answer
                                                   join e in Exam on sa.ExamId equals e.ExamId
                                                   group sa by new { UserId = sa.UserId, ExamId = sa.ExamId, }
                                                   into gsa
                                                   select new 
                                                   {
                                                       UserId = gsa.Key.UserId,
                                                       ExamId = gsa.Key.ExamId,
                                                       ScoreCount = gsa.Sum(x => x.Score),
                                                   })
                                              on new { UserId = u.UserId, ExamId = ue.ExamId } equals new { UserId = sac.UserId, ExamId = sac.ExamId }
                                              into sac2
                                      from sac in sac2.DefaultIfEmpty()
生成sql语句正常 但报错 Nullable object must have a value.
解决方法:
    public class GroupExam
    {
        public int? UserId { get; set; } 
        public int? ExamId { get; set; }
        public decimal? ShortAnswerScoreCount { get; set; }
    }
将原linq修改为
                                      from u in User
                                      join sac in (from sa in Answer
                                                   join e in Exam on sa.ExamId equals e.ExamId
                                                   group sa by new { UserId = sa.UserId, ExamId = sa.ExamId, }
                                                   into gsa
                                                   select new GroupExam
                                                   {
                                                       UserId = gsa.Key.UserId,
                                                       ExamId = gsa.Key.ExamId,
                                                       ScoreCount = gsa.Sum(x => x.Score),
                                                   })
                                              on new { UserId = u.UserId, ExamId = ue.ExamId } equals new { UserId = (int)sac.UserId, ExamId = sac.ExamId }
                                              into sac2
                                      from sac in sac2.DefaultIfEmpty()
问题解决
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号