子表为空,但子表的FID不为null,导致根据主表字段查出来的值也为null
解决方法:添加联合主键 (在view视图类型中经常用到) 和 将子表主键默认设置为-1
将下面代码
public ProjectDetailViewMap()
{
this.ToTable("Sys_ProjectDetailView");
this.HasKey(t => t.F_Id );
}
改为:
public ProjectDetailViewMap()
{
this.ToTable("Sys_ProjectDetailView");
this.HasKey(t => new { t.F_Id,t.project_id});
}
在sql中添加的视图,如果子表的FID不允许为null时,创建视图根据主表左连会导致子表的FID为null,违背了子表的建表逻辑.
当进行查询时,查出来的子表为空时则ProjectDetailViewEntity
记录为null
public List<ProjectDetailViewEntity> SearchSumByYear(int year)
{
return detailviewService.IQueryable().Where(p => p.F_ProjectYear == year).ToList();
}
在sql中修改创建的视图view,将子表主键默认设置为-1
,再次查询,即可查询出子表记录
SELECT pe.F_Id AS project_id, pe.F_ProjectYear, pe.F_ProjectTitle, si.F_FullName, si.F_ParentId, CASE WHEN pd.F_Id IS NULL
THEN '-1' ELSE pd.F_Id END F_Id, pd.F_ProjectFID, pd.F_ItemFID, pd.F_ContractName, pd.F_ProjectTime,
pd.F_DocumentNumber, pd.F_ProjectFee, pd.F_FileFID, pd.F_SortCode, pd.F_DeleteMark, pd.F_EnabledMark,
pd.F_Description, pd.F_CreatorTime, pd.F_CreatorUserId, pd.F_LastModifyTime, pd.F_LastModifyUserId, pd.F_DeleteTime,
pd.F_DeleteUserId
FROM dbo.Sys_Project AS pe LEFT OUTER JOIN
dbo.Sys_ProjectDetail AS pd ON pe.F_Id = pd.F_ProjectFID LEFT OUTER JOIN
dbo.Sys_Items AS si ON si.F_Id = pd.F_ItemFID AND si.F_EnCode = 'projectroot'
WHERE (pe.F_IsDelete = 0)
关键点 : CASE WHEN pd.F_Id IS NULL THEN '-1' ELSE pd.F_Id END F_Id
复习点: Case具有两种格式。简单Case函数和Case搜索函数。
- 简单Case函数
CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END
- Case搜索函数
CASE WHEN sex = '1' THEN '男' WHEN sex = '2' THEN '女' ELSE '其他' END
这两种方式,可以实现相同的功能。简单Case函数的写法相对比较简洁,但是和Case搜索函数相比,功能方面会有些限制,比如写判断式。还有一个需要注意的问题,Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略。