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

问题解决

猜你喜欢

转载自www.cnblogs.com/WNpursue/p/10870540.html
今日推荐