2016-07-28 6 views
0

Heey、私たちは教師と学生関係を持っていると仮定します。先生は学生グループを担当します。今度は、先生が責任を負う学生を含め、教師のすべての情報をロードしたいと言うことができます。しかし、そのクラスの学生からは、名前を含む列だけをロードしたいので、年齢とStudentNumber(下記参照)。今私の質問は、私はそれをどうするのだろうか?Entityframeworkエンティティにリストの特定の列をロードする

https://colinmackay.scot/2011/07/31/getting-just-the-columns-you-want-from-entity-framework/この問題を解決するための試みでは、私の状況とほぼ同じですが、リンクに表示されている例では文字列のリストが返されます。

クラス:ローディングの

public class SchoolContext : DbContext 
{ 
    public DbSet<Teacher> Teachers { get { return Set<Teacher>(); } } 
} 


public class Teacher 
{ 
    [Key] 
    public int ID { get; private set; } 
    public string Name { get; set; } 
    public List<Students> Students { get; set; } 
} 



public class Students 
{ 
    [Key] 
    public int DatabaseID { get; private set; } 
    public int StudentNumber { get; set; } 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

例:

private static void Main(string[] args) 
    { 
     var Teacher = LoadTeacher(4); 
     foreach(var student in Teacher.Students) 
     { 
      Console.WriteLine(student.Name); 
     } 
    } 


    public static Teacher LoadTeacher(int teacherID) 
    { 
     using (var context = new SchoolContext()) 
     { 
      return context.Teachers.Where(t => t.ID == teacherID) 
            .FirstOrDefault(); 
            //At this part is my question, how would i make sure that only the name of those students are loaded and not the Age and the StudentNumber? 

     } 
    } 

答えて

1

あなたが返すようにしたいものを自分のコンテキストで選択する必要があります。 そして、このように匿名オブジェクト

として復帰この:

public static IQueryable LoadTeacher(int teacherID) 
{ 
    using (var context = new SchoolContext()) 
    { 
     var retVal = from teacher in context.Teachers 
        where teacher.ID == teacherID 
        select new { 
          Teacher = teacher, 
          StudentNames = from student in teacher.Students 
              select student.Name 
          } 
     return retVal; 
    } 
} 

次に、あなたがあなたの呼び出し元のメソッドからこのオブジェクトにアクセスすることができます。ノー@msanz

+0

匿名のクラスタイプを返すことはお勧めできません。その答えは、明示的に定義された転送タイプの定義によって、より良いでしょう。 – grek40

+0

私の意見では、あなたが結果をどうしたいかによって異なります。 Webアプリケーションのテーブルにこれを表示したいのであれば、Jsonオブジェクトに入れるのが一般的であるため、結果の定義クラスは必要ないので、プロジェクトは大きくなりません各クエリで –

+0

これは今まで最高の解決策であるようです。 – Sulicio

0

おそらくSelectを使用した:

プロジェクト新しい形に配列の各要素。

public static Teacher LoadTeacher(int teacherID) 
{ 
    using (var context = new SchoolContext()) 
    { 
     return context.Teachers.Where(t => t.ID == teacherID) 
           .Select(t => new Teacher() { Name = t.Name }) 
           .FirstOrDefault(); 
    } 
} 
+0

、プロバイダーはクエリで使用される列のみを選択します。 – user3185569

0

あなたはラムダクエリの場合の

teachers.First(t => t.ID == 10).Students.SelectMany(s=> s.Name) 

編集

をこのような学生の名前を持つことができますあなたが同様に教師のオブジェクトが必要

teachers.Where(t => t.ID == 10).Select(t=>new {teacher= t,studenNames =t.Students.SelectMany(s => s.Name) }).First() 
+0

これは実際には名前だけが必要な場合は良い解決策ですが、私の場合は教師オブジェクトを同じクエリから取得する方が好きです。 – Sulicio

+0

@サリシオこのような意味ですか? (編集) –

+0

はい、それは私が探している場所です:P(それは@ Yggrasによって提供された解決法と同じですが、あなたがそれを見なかったと仮定しています) – Sulicio

関連する問題