Ваша проблема не в вашем коде. Проблема в том, как вы думаете, что вы решаете это. Подумайте правильно, решение будет правильным. @ Zer0 уже упоминал об этом, но вам, вероятно, нужно больше объяснений. Я попытаюсь объяснить с некоторым предположением, что вы, возможно, захотите это сделать -
1: Если Student
может иметь несколько стран, городов, навыков и резюме, то StudentVM
класс у вас, безусловно, неправильно. По определению он поддерживает только один город, страну, навык и т. Д. c. Измените его так, чтобы он поддерживал кратные значения -
public class StudentListVM
{
public string studentName { get; set; }
public List<string> countries { get; set; }
public List<string> cities { get; set; }
public string skills { get; set; }
public List<string> resume { get; set; }
//does not make sense to have a list, a person has only one DOB
public DateTime dateOfBirth { get; set; }
}
, тогда у вас будет работать код -
public ActionResult GetStudentsInfo ()
{
var students = (from stud in db.Students
group stud by stud.StudentId into sg
select new
{
studentName=sg.Select(s=>s.StudentName).FirstOrDefault(),
coutryName=sg.Select(c=>c.Country.CountryName),
cityName=sg.Select(ct=>ct.Country.Cities.Select(x=>x.CityName)),
skillName=sg.Select(sk=>sk.StudentSkills.Select(s=>s.Skill.SkillName)),
resumeName=sg.Select(r=>r.Resumes.Select(m=>m.ResumeName)),
dob=sg.Select(d=>d.DateOfBirth).FirstOrDefault()
}).ToList();
List<StudentListVM> studentLists=new List<StudentListVM>();
foreach (var item in students)
{
studentLists.Add(new StudentListVM
{
studentName = item.studentName,
countries = item.coutryName.ToList(), //should work, as these are lists
cities = item.cityName.ToList(), //should work, as these are lists
skills = string.Join(",", item.skillName),
resume = item.resumeName.ToList(), //should work, as these are lists
dateOfBirth = item.dob //does not make sense to have a list, a person has only one DOB
});
}
return View(studentLists);
}
2: Как только с классом все в порядке, вы можете сократить код. Вам не нужен второй блок для создания типизированного списка, вы можете сделать это напрямую -
public ActionResult GetStudentsInfo ()
{
var students = (from stud in db.Students
group stud by stud.StudentId into sg
select new StudentListVM
{
studentName=sg.Select(s=>s.StudentName).FirstOrDefault(),
countries=sg.Select(c=>c.Country.CountryName).ToList(),
cities=sg.SelectMany(ct=>ct.Country.Cities.Select(x=>x.CityName)).ToList(),
skills=string.Join(",", sg.Select(sk=>sk.StudentSkills.Select(s=>s.Skill.SkillName))),
resume=sg.SelectMany(r=>r.Resumes.Select(m=>m.ResumeName)).ToList(),
//does not make sense to have a list, a person has only one DOB
dob=sg.Select(d=>d.DateOfBirth).FirstOrDefault()
}).ToList();
return View(students);
}
3: Если вышеупомянутое не имеет смысла, то идея не правильно. Подумайте, чего вы пытаетесь достичь, и обновите вопрос. Может быть, тогда люди смогут помочь.
Вы сказали -
На самом деле я могу сделать их отдельно по-разному, но я не могу сделать это в одном коде
Так что эти пути? Упоминание о них, вероятно, даст представление о том, чего вы пытаетесь достичь. Подробных данных по этому вопросу недостаточно, чтобы дать вам решение. Это не говорит о том, что вы пытаетесь сделать.