0

我正在尝试将 2 个表与一对可能的关系连接起来,但我只希望“一个”列数据出现在一行中,在所有其他行中它应该为空(不管是哪一行)。所以:

TEACHER
---------
TeacherID
TeacherBiography
.
.
.

STUDENT
-----------
TeacherID
StudentFName
StudentLName
.
.
.

示例:您想获取所有 First Name 为 'Joe' 的学生,使用 TeacherID 加入 Teacher,但限制返回的结果,以便不会在每一行都返回 Teacher 数据。原因是TeacherBiography 很大;我需要它返回,但不是在每一行。

所以一些示例输出应该如下所示:

------------------------------------------------
StudentFName | StudentLName | TeacherID | TeacherBiography
------------------------------------------------
'Joe'        | 'Smith'      | 1         | 'long biography for teacher 1..'  
'Joe'        | 'Jones'      | 2         | 'long biography for teacher 2..'  
'Joe'        | 'Michaels'   | 1         | null
'Joe'        | 'Rogers'     | 3         | 'long biography for teacher 3..' 
'Joe'        | 'Washington' | 1         | null
.
.
.
.

因此,在 Michaels 和 Washington 的情况下,TeacherBiograph(以及所有其他教师列)为空,因为数据已在 Smith 行中返回。

我该怎么做?

-J

4

2 回答 2

0

我认为唯一有效的方法是将STUDENTs 和TEACHERs 与TeacherID作为键连接,然后您可以只为一行输出此键一次,而为相同的键输出其他行null,如下所示:

var StudentsList = students.Join(  //Inner join
    Teachers,
    s => s.TeacherID,
    t => t.TeacherID,
    (teacher, teacherStudetns) => 
        new
        {
            Teacher = teacher,
            HisStudents = teacherStudetns
        });

然后你可以只输出一次密钥,例如:

foreach(var item in StudentsList)
{
     Console.Writline("Teach Name: {0}, His students:", item.TeacherBiography);
     foreach(var student in item.HisStudents)
     {
         Console.writeLine("---------- {0}", student.StudentName);
     }
}
于 2012-04-20T13:34:15.343 回答
0

我将分两步完成此操作,而不是使您的代码复杂化以尝试一次性完成。首先,检索您关心的学生信息。一旦你有了它,你可以执行另一个查询来获取教师信息,给定不同的教师 ID 列表。

var students = //student query
var teacherIds = students.Select(p => p.TeacherID).Distinct();
var teachers = teacherTable.Where(p => p.Contains(teacherIds));

然后,您可以将两个结果连接到内存中。

var allData = from s in students
    join t in teachers on
    t.teacherID equals s.TeacherID
    select new { StudentName = s.Name, TeacherBio = t.TeacherBiography};

这将导致两次数据库命中,但您只会返回您需要的数据项。

于 2012-04-20T13:36:51.363 回答