SQL查询含NULL外键的课程返回MVC项目时单日课程不显示问题
问题根源
你现在的查询结果过滤了单天课程,核心原因是2个:
- SQL里对
WeekDayID2关联用了INNER JOIN:内连接要求关联的两边字段都有非空匹配值才会返回行,当Course表的WeekDayID2为NULL时,无法和tblSiteWeekDay匹配,整条课程数据会被直接排除,最终只有两天的课程会被返回。 - 视图判断逻辑有漏洞:即使SQL返回了
WeekDayTitle2为NULL的结果,你现在用item.WeekDayTitle2!=""判断的话,NULL不等于空字符串,会误触发条件输出多余内容。
具体修复方案
1. 修改SQL查询语句
把第二个内连接改成LEFT JOIN(左外连接),保留WeekDayID2为NULL的课程行,同时可以用COALESCE把NULL转为空字符串,避免C#中出现NULL值问题:
select CourseID, tsw1.WeekDayTitle as WeekDayTitle1, COALESCE(tsw2.WeekDayTitle, '') as WeekDayTitle2 from Course inner join tblSiteWeekDay as tsw1 on Course.WeekDayID1=tsw1.SiteWeekDayID left join tblSiteWeekDay as tsw2 on Course.WeekDayID2=tsw2.SiteWeekDayID
如果你的数据库是SQL Server,也可以用ISNULL(tsw2.WeekDayTitle, '')替代COALESCE,效果一致。
2. 优化视图判断逻辑
把原有判断改为判断字符串是否为空或者NULL,覆盖所有无值的场景:
@foreach (var item in Model) { <div> <span>@item.WeekDayTitle1</span> @if (!string.IsNullOrEmpty(item.WeekDayTitle2)) { <span>和 @item.WeekDayTitle2 </span> } </div> }
可选优化:修正模型字段名
你当前的CourseModel里的CoursID拼写少了一个字母e,和SQL返回的CourseID不匹配,如果你是用字段名自动映射的话,建议修正为:
public class CourseModel{ public int CourseID { get; set; } // 修正拼写 public string WeekDayTitle1 { get; set; } public string WeekDayTitle2 { get; set; } }
内容的提问来源于stack exchange,提问作者user16070481
相关产品推荐
相关产品推荐

