解决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()

问题解决

posted @ 2019-05-15 16:55  Pursue`  阅读(1186)  评论(0编辑  收藏  举报