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

    问题解决

  • 相关阅读:
    不开心的事
    git push 时 error: RPC failed; HTTP 400 curl 55 Send failure: Connection was reset 问题
    Java多线程相关
    angularJS 级联下拉框
    leetcode260 Single Number III
    -2147483648的绝对值
    git 提交信息模板
    rabbitmq at com.rabbitmq.client.impl.Frame.readFrom(Frame.java:91) ~[amqp-client-5.4.3.jar:5.4.3] 错误
    Unity 切换场景的注意点
    Java位运算
  • 原文地址:https://www.cnblogs.com/WNpursue/p/10870540.html
Copyright © 2020-2023  润新知