左边加入Linq,可以参考

时间:2014-08-27 09:35:08

标签: c# linq linq-to-sql

我有两张桌子,一张用于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表....

1 个答案:

答案 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();