我有两张桌子,一张用于MainCourse,一张用于SubCourse。 MainCourse不一定需要SubCourse,因此SubCourse表中没有与MainCourse ID相关的空值....
我必须在linq中创建一个左连接...我可以创建一个普通连接,但问题是当我运行连接时,只有数据会显示哪个有MainCourse和SubCourse。我需要展示没有SubCourse的MainCourse。
这就是我所做的:
仅返回具有MainCourse和SubCourse的数据
var query = (from mc in context.SkillAssessCourseMains
join sc in context.SkillAssessCourseSubs
on mc.ID equals sc.MainCourseRef
select new
{
sc.ID,
mc.CourseName,
sc.SubCourseName
}).DefaultIfEmpty().ToList();
尝试修改它以恢复所有数据会给我一个错误:转换为值类型'Int32'失败,因为具体化值为null。结果类型的泛型参数或查询必须使用可空类型。 (代码下方)
var query = (from mc in context.SkillAssessCourseMains
from sc in context.SkillAssessCourseSubs.Where(sc => sc.MainCourseRef == mc.ID).DefaultIfEmpty()
select new
{
sc.ID,
mc.CourseName,
sc.SubCourseName
}).ToList();
我知道错误是因为没有链接到子模块..
我也试过这个:
var query = (from mc in context.SkillAssessCourseMains
join sc in context.SkillAssessCourseSubs
on mc.ID equals sc.MainCourseRef into results
from r in results.DefaultIfEmpty()
select new
{
r.ID,
mc.CourseName,
r.SubCourseName
}).ToList();
这也给了我一个错误:转换为值类型'Int32'失败,因为具体化值为null。结果类型的泛型参数或查询必须使用可空类型。
表格设计为:
MainCourse: ID, CourseName
SubCourse: ID, SubCourseName, MainCourseRef
任何人都可以指出我正确的方向或告诉我我做错了什么?任何帮助将不胜感激....
修改
数据示例:
MainCourse表:
ID MainCourseName
1 Health & Safety
2 Customer Care
子课程表:
ID SubCourseName MainCourseRef
1 Introduction 1
2 First Aid 1
3 SHE rep course 1
因此,我想带回的数据是:
MainCourseName SubCourseName
Healt & Safety Introduction
Healt & Safety First Aid
Healt & Safety SHE rep course
Customer Care NULL
也是ID,但可以来自SubCourse或MainCourse表....
答案 0 :(得分:1)
错误,因为mc.ID是int,但sc.MainCourseRef不是int。
如果MainCourseRef是“MainCourse”类型,那么试试这个
on mc.ID equals sc.MainCourseRef.ID
修改强>
var query = (from mc in context.SkillAssessCourseMains
join sc in context.SkillAssessCourseSubs.Where(x=>x.MainCourseRef!=null)
on mc.ID equals sc.MainCourseRef into results
from r in results.DefaultIfEmpty()
select new
{
r.ID,
mc.CourseName,
r.SubCourseName
}).ToList();