Не удается неявно преобразовать тип «System.Collection.Generi c .IEnumerable <string>» в «строку» при добавлении данных в ViewModel - PullRequest
0 голосов
/ 06 марта 2020

При использовании LinQ доступны данные из таблицы внешних ключей. Но когда я пытаюсь «добавить» в свою ViewModel, это предупреждение показывает. Предупреждения отличаются друг от друга. например,

Cannot implicitly convert type 'System.Collection.Generic.IEnumerable<string>' to 'string'

и

Cannot implicitly convert type 'System.Collection.Generic.IEnumerable<System.Collection.Generic.IEnumerable.IEnumerable<string>' to 'string'.

Я попытался привести к ToString (), но это было бесполезно, никаких ошибок не видно, но данные были заменены системными сообщениями. Я также пытался использовать LinQ Join в учениках, но я не смог показать Skills Comma Separated таким образом.

Вот мой код:

         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)

                            }).ToList();

            List<StudentListVM> studentLists=new List<StudentListVM>();

            foreach (var item in students)
            {
                studentLists.Add(new StudentListVM
                {
                    studentName = item.studentName,
                    country = item.coutryName, //warnings here
                    city = item.cityName, //warnings here
                    skills = string.Join(",", item.skillName),
                    resume = item.resumeName, //warnings here
                    dateOfBirth = item.dob //warnings here
                });
            }
            return View(studentLists);

        }

          ```

StudentListVM class



 public class StudentListVM
    {
        public string studentName { get; set; }
        public string country { get; set; }
        public string city { get; set; }
        public string skills { get; set; }
        public string resume { get; set; }
        public DateTime dateOfBirth { get; set; }
    }

    ```

Я пробовал это раньше


 var students = (from stud in db.Students
                            join con in db.Countries on stud.CountryId equals con.CountryId
                            join ct in db.Cities on stud.CityId equals ct.CityId
                            join rsm in db.Resumes on stud.ResumeID equals rsm.ResumeId
                            join stsk in db.StudentSkills on stud.StudentId equals stsk.StudentId
                            //group stud by stud.StudentId into sg

                            select new StudentListVM()
                            {

                                studentName = stud.StudentName,
                                countries = con.CountryName,
                                cities = ct.CityName,
                                skills=stsk.Skill.SkillName,
                                resumes = rsm.ResumeName,
                                dateOfBirth = stud.DateOfBirth,



                            }).ToList();
        ```


StudentSkill class:

     public partial class StudentSkill
{
    public int StudentSkillsId { get; set; }
    public int StudentId { get; set; }
    public int SkillId { get; set; }

    public virtual Student Student { get; set; }
    public virtual Skill Skill { get; set; }
}

    ```

Возвращает все отлично, кроме умений в списке через запятую. Все, что мне нужно, это показать свои множественные навыки, которые проверяются многократно и добавляются в базу данных в виде отдельной таблицы с именем StudentSkills. Есть ли хорошее решение для этого?

Ответы [ 3 ]

0 голосов
/ 06 марта 2020

Ваша проблема не в вашем коде. Проблема в том, как вы думаете, что вы решаете это. Подумайте правильно, решение будет правильным. @ 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: Если вышеупомянутое не имеет смысла, то идея не правильно. Подумайте, чего вы пытаетесь достичь, и обновите вопрос. Может быть, тогда люди смогут помочь.

Вы сказали -

На самом деле я могу сделать их отдельно по-разному, но я не могу сделать это в одном коде

Так что эти пути? Упоминание о них, вероятно, даст представление о том, чего вы пытаетесь достичь. Подробных данных по этому вопросу недостаточно, чтобы дать вам решение. Это не говорит о том, что вы пытаетесь сделать.

0 голосов
/ 06 марта 2020

Попробуйте изменить эту строку:

skills = string.Join(",", item.skillName),

С этим:

skills = string.Join(",", item.skillName.ToArray()),
0 голосов
/ 06 марта 2020

Вы пытаетесь назначить группу строк, в частности, различные коллекции IEnumerable<string>, в одну строку из-за ваших вызовов Select().

Например, эта строка явно выбирает более одного имени для резюме.

resumeName=sg.Select(r=>r.Resumes.Select(m=>m.ResumeName))

Если вам все равно, и вы ожидаете, что они будут иметь одинаковое значение Вы можете просто взять первый:

resume = item.resumeName.FirstOrDefault()

Или сгладить коллекцию другим способом.

Тем не менее, когда вы берете коллекции и попытайтесь присвоить его одному элементу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...