使用linq进行自引用连接

时间:2012-02-21 14:21:49

标签: c# linq

我的数据库有一个学生表:

StudentID int PK
StudentName varchar
FamilyID int (Nullable)

如果学生在数据库中有兄弟姐妹,他们将共享一个familyID。如果学生没有兄弟姐妹,则familyID应为null。

使用Linq,给定StudentID,如何返回包含学生及其所有兄弟姐妹(如果有)的列表?

4 个答案:

答案 0 :(得分:3)

具有join的{​​{1}}应该可以解决问题。

into

您可以添加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

答案 1 :(得分:2)

使用LinQ方法链,这将返回仅包含兄弟姐妹的列表:

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();

答案 2 :(得分: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 :(得分: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的家庭成员。这个答案是基于这样的假设:你一次只找一个家庭,而不是所有家庭的清单。