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解决方法:
////// 解决问题: efcore group new dynamic对象时生成int 型而不是 int? 而导致 Nullable object must have a value.的问题 /// public class GroupTableViewModel { ////// Key /// public int? Id { get; set; } ////// Count /// public int? Count { get; set; } ////// Sum /// 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()
问题解决