0

2つのテーブルを1対1の関係で結合しようとしていますが、「1つの」列データのみを1つの行に表示したいので、他のすべての行ではnullにする必要があります(どちらの行でも構いません)。それで:

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

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

例:名が「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の場合、データはすでにSmith行に返されているため、TeacherBiograph(および他のすべての教師列)はnullになります。

どうすればいいのですか?

-J

4

2 に答える 2

0

コードを複雑にして1つで実行するのではなく、2つのステップでこれを実行します。まず、気になる生徒の情報を取得します。それができたら、TeacherIDの個別のリストを指定して、別のクエリを実行して教師情報を取得できます。

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

次に、2つの結果をメモリに結合できます。

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

これにより、データベースが2回ヒットしますが、返されるのは必要なデータ項目のみです。

于 2012-04-20T13:36:51.363 に答える
0

これを行う唯一の効率的な方法は、STUDENTsとTEACHERsをTeacherIDキーとして結合することです。この場合、次のように、このキーを1つの行に対して1回だけ出力し、他の行を同じキー出力に対して出力できますnull

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

次に、キーを1回だけ出力できます。次に例を示します。

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 に答える