2012-02-21 60 views
2

我的數據庫中有一個學生表:自我指涉加入使用LINQ

StudentID int PK 
StudentName varchar 
FamilyID int (Nullable) 

如果學生有兄弟姐妹在數據庫中,他們將分享FAMILYID。如果學生沒有兄弟姐妹,familyID應該爲空。

使用Linq,給定一個StudentID,如何返回一個包含學生和他所有兄弟姐妹(如果有)的列表?

回答

1

你可以做這樣的事情

List<Student> lstStd = new List<Student>(); 

var student = (from s in students 
where s.studentid = studentid 
select s).FirstOrDefault(); 
lstStd.Add(student);  

if(student!=null) 
{ 
    if(student.FamilyId !=null) 
     { 
        lstStd.AddRange((from s in students 
        where s.FamilyId == student.Familyid 
         && s.studentid != student.studentid 
        select s).ToList<Student>()); 
     } 
} 
3

一個joininto應該做的伎倆。

var query = from s in students 
      join s2 in students.Where(x => x.StudentId != s.StudentId) on s.FamilyId equals s2.FamilyId into siblings 
      select new 
      { 
       Student = s, 
       Siblings = siblings, 
      }; 

你可以爲了得到一個特定的StudentId

+0

這不會編譯。我得到「這個名字」在當前語境中不存在「。 – Aheho 2012-02-22 04:38:35

+0

錯誤指的是以下子句中的s:(x => x.StudentID!= s.StudentID) – Aheho 2012-02-22 04:39:31

2

使用LINQ的方法鏈添加一個query.FirstOrDefault(x => s.StudentId == yourStudentId),這將返回只有兄弟姐妹的列表:

var siblings = students.Where(s => s.FamilyId == students.Single(st => st.StudentId == id).FamilyId).ToList(); 

或2個步驟所以你可以提供對學生實例的支票:

var student = students.Single(st => st.Id == id); 
var siblings = students.Where(s => s.FamilyId == student.FamilyId).ToList(); 
+1

爲什麼將它們分開,OP要求'包含學生和他所有兄弟姐妹(如果有)的列表?' 。只需從第一個代碼中省略's.StudentId!= id'子句即可。是/否? – AlanT 2012-02-21 14:57:54

+0

你是對的!我讀錯了,我以爲他只想要兄弟姐妹..我更新了我的答案,再次感謝! ;) – Abbas 2012-02-21 15:00:35

0
var sid = 123; 
    var query = from s in Students 
       where (from s2 in Students where s2.Id == sid select s2.FamilyId).FirstOrDefault() == s.FamilyId 
       && s.FamilyId != null 
       select s; 

如果我正確理解你的問題。您正在尋找指定學生ID的家庭成員。這個答案是基於這樣的假設,即你一次只尋找一個家庭,而不是所有家庭的名單。