2012-02-21 18 views
2

を使用して参加:自己参照マイデータベースは、学生のテーブルを持ってLINQ

StudentID int PK 
StudentName varchar 
FamilyID int (Nullable) 

学生は、データベース内の兄弟を持っている場合、彼らはfamilyIDを共有します。生徒に兄弟がいない場合、familyIDはnullにする必要があります。

StudentIDを指定してLinqを使用すると、学生とその兄弟すべて(もしあれば)を含むリストを返すことができますか?

答えて

1

あなたがトリックを行う必要がありますintoとこの

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

joinような何かを行うことができます。

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

+0

エラーは、次の節のsを参照しています。(x => x.StudentID!= s.StudentID) – Aheho

2

を得るために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

+0

あなたは絶対に正しいです!私はそれが間違って読んで、私は彼が兄弟がほしいと思った..私は私の答えを更新しました、再びありがとう! ;) – Abbas

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の家族を探しています。この答えは、一度に1つの家族だけを探しているという仮定に基づいており、すべての家族のリストではありません。