2017-08-25 11 views
0

を使用して、プリミティブプロパティにオブジェクトを展開する方法:のは、私は次のクラスがあるとしましょうLINQ

public class StudentTeacher 
{ 
public Student Student {get; set;} 
public Teacher Teacher {get; set;} 
public int OverlappingClasses {get; set;} 
} 

さて、私のコードでは、私はオブジェクトのリストを持っています。

List<StudentTeacher> studentTeacher = GetStudentTeachers(); 

ここで、すべてのプロパティをオブジェクトではなくプロパティとして選択する必要があります。

たとえば、私はこれを行うことができます:​​とそれはオブジェクト(IEnumerable)のリストを返します。

しかし、私は複数のプロパティを選択した場合、すなわちstudentTeacher.Select(X => {x.Student、x.Teacher}新しい)。ToListメソッド()戻り値の型ではなく、この複雑な匿名の、IEnumerable {Anonymous {Student, Teacher}}

方法でありますタイプIは、プロパティを持つシンプルな匿名型を持つことができます。このようにするには、select句にすべてのプロパティを明示的に指定する方法がありますが、私の特定の使用例では、各オブジェクトに30以上のプロパティがあり、プロパティの総数は100を超えます(これはAnonymous{StudentID, StudentName, StudentLastName, TeacherID, TeahcerName, TeacherLastName, etc.}です)。 。)

+0

反射を使用してこれを行う方法があるかもしれませんが、わかりません。しかし、これらのクラスの両方に同じ名前のプロパティがありますか? – adiga

+0

オブジェクトを単一の匿名型にフラット化したいのですか?それで、Student.IdはStudentIdなどになりますか?その場合、 はどのように参照ループを処理する予定ですか? – john

+0

DTOを作成してAutoMapperを使用してみませんか? –

答えて

0
studentTeacher.Select(x=> new 
{x.Student.StudentID, x.Student.StudentName, x.Student.StudentLastName, x.Teacher.TeacherID, x.Teacher.TeahcerName, x.Teacher.TeacherLastName, etc.}) 

それはあなたがたくさんある場合はまた、あなたが直接 例えば

studentTeacher.Select(x=> new 
{ StudentID = x.Student.StudentID, x.Student.StudentName, x.Student.StudentLastName, x.Teacher.TeacherID, x.Teacher.TeahcerName, x.Teacher.TeacherLastName, etc.}) 
+0

OPは彼がこれを既に知っていて、動的に行うことができるかどうかを知りたがっています。 – adiga

0

を割り当てることができますつまり、学生= x.Student.StudentID オブジェクトの内部名としてプロパティ名を使用しますなぜクラス全体を選択しないのですか?

IEnumerable<StudentTeacher> studentTeachers = GetStudentTeachers(); 
IEnumerable<StudentTeacher> femaleTeachers = studentTeachers 
    .Where(teacher => teacher.IsFemale); 

これですべてのプロパティについて言及する必要はありません。

すなわち
var TeachersWithTheirStudents = studentTeachers.GroupJoin(students, 
    teacher => teacher.Id, 
    student => student.TeacherId, 
    (teacher, students) => new 
    { 
     Teacher = teacher, 
     HisStudents = students, 
    } 

:グループはTeachersStudentsの集まりに参加する参加してこれも動作します。それぞれTeacherからIdになります。私は、これはあなたが何をしようとしてあると思い性質TeacherHisStudents

1

と1つの匿名のオブジェクトを作成し、このTeacherとすべての彼のStudentsから、このIdに等しいTeacherIdですべてStudentsを取る:

public class Student 
    { 
     public int StudentId 
     { 
      get; 
      set; 
     } = 1; 

     public string StudentName 
     { 
      get; 
      set; 
     } = "Name"; 
    } 

    public class Teacher 
    { 
     public int TeacherId 
     { 
      get; 
      set; 
     } = 666; 

     public string TeacherName 
     { 
      get; 
      set; 
     } = "TeacherName"; 
    } 

    public class StudentTeacher 
    { 
     public Student Student 
     { 
      get; 
     } = new Student(); 

     public Teacher Teacher 
     { 
      get; 
     } = new Teacher(); 
    } 

    public static dynamic GetAnonType(Student student, Teacher teacher) 
    { 
     var propertyNamesAndPropertiesStudent = student.GetType().GetProperties().Select(item => Tuple.Create($"{nameof(Student)}{item.Name}", item.GetMethod.Invoke(student, null))); 
     var propertyNamesAndPropertiesTeacher = teacher.GetType().GetProperties().Select(item => Tuple.Create($"{nameof(Teacher)}{item.Name}", item.GetMethod.Invoke(teacher, null))); 
     dynamic sampleObject = new ExpandoObject(); 
     foreach(var propertyNamePropertyValuePair in propertyNamesAndPropertiesStudent) 
     { 
      ((IDictionary<string, object>)sampleObject).Add(propertyNamePropertyValuePair.Item1, propertyNamePropertyValuePair.Item2); 
     } 

     foreach(var propertyNamePropertyValuePair in propertyNamesAndPropertiesTeacher) 
     { 
      ((IDictionary<string, object>)sampleObject).Add(propertyNamePropertyValuePair.Item1, propertyNamePropertyValuePair.Item2); 
     } 

     return sampleObject; 
    } 

あなたはこのように、これを呼び出すことができます。

 var studentTeachers = new List<StudentTeacher> {new StudentTeacher()}; 
     var anonTypes = studentTeachers.Select(item => GetAnonType(item.Student, item.Teacher)); 

anonTypesはメンバーStudentId、ステューと匿名型の列挙になりますdentName、TeacherId、TeacherName。これは、より大きなオブジェクトに拡大する必要があります。

関連する問題