/편집 :
ON S.MARKID=M.MARKID OR (S.MARKID IS NULL AND M.MARKID IS NULL)
C#에서 당신은 비교 연산자와 IS NULL
이 변환됩니다 LINQ 공급자 예를 사용할 수 있습니다 내 첫 번째 대답은 FULL OUTER JOIN을 사용하는 것입니다. 이것은 정상을 넘은 길이었고 아마도 잘못되었거나 완벽하게 교정되지 않았습니다.
새로운 대답은 LEFT OUTER JOIN을 사용합니다. LinqPad를 사용하여 몇 가지 샘플 데이터를 작성하여 실제 예제를 얻었습니다. LinqPad를 사용하지 않는 경우 .Dump()
메소드를 무시하십시오.
var Students = new List<Student>() {
new Student() {StudentId = 1, Name ="John", MarkId = 1},
new Student() {StudentId = 1, Name ="Paul", MarkId = 1},
new Student() {StudentId = 1, Name ="Steve", MarkId = 1},
new Student() {StudentId = 1, Name ="John", MarkId = 2},
new Student() {StudentId = 1, Name ="Paul", MarkId = 3},
new Student() {StudentId = 1, Name ="Steve", MarkId = 1},
new Student() {StudentId = 1, Name ="Paul", MarkId = 3},
new Student() {StudentId = 1, Name ="John" },
new Student() {StudentId = 1, Name ="Steve" },
new Student() {StudentId = 1, Name ="John", MarkId = 1}
};
var Marks = new List<Mark>() {
new Mark() {MarkId = 1, Value = 60},
new Mark() {MarkId = 2, Value = 80},
new Mark() {MarkId = 3, Value = 100}
};
var StudentMarks = Students
.GroupJoin(
Marks,
st => st.MarkId,
mk => mk.MarkId,
(x,y) => new {
StudentId = x.StudentId,
Name = x.Name,
Mark = y.Select (z => z.Value).SingleOrDefault()
}
)
.Dump();
}
public class Student
{
public int StudentId { get; set; }
public string Name { get; set; }
public int MarkId { get; set; }
}
public class Mark
{
public int MarkId { get; set; }
public int Value { get; set; }
}
출력하십시오 MarkId없이
당신이 CANN 내 학생 목록에서 볼 때, 거기에 2 명 학생. 그 2는 .SingleOrDefault()
으로 인해 할당 된 기본값을 얻습니다.나는 이것이 당신의 문제를 해결할 것이고 당신에게 더 이상의 피델링을위한 좋은 기초를 제공 할 것이라고 생각합니다.
참조 : How do you perform a left outer join using linq extension methods
혼란 스럽습니다. 학생 이름을 선택하는 것이 왜 처음에 합류하는 것입니까? – mattytommo
@mattytommo : 그냥 테스트 일뿐입니다. –
@mattytommo : 예제 일뿐입니다. –