2012-02-21 47 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的家庭成员。这个答案是基于这样的假设,即你一次只寻找一个家庭,而不是所有家庭的名单。