Home > Back-end >  Putting data from two tabels in one ViewData
Putting data from two tabels in one ViewData

Time:08-27

I'm trying to put data form two tabels (AcademicDegrees, Lecturers) conneted by one to many relation into one ViewData to generate options to field (with label and id as value). It shoud be somthing like this where id are used as values nad other field as label.

ViewData["ClassroomsId"] = new SelectList(_context.Classroom, "ClassroomsID", "Number");

When all the date for field was in one table I used getter form field to get it.

[NotMapped]
public string toStringVar => FirstName   " "   LastName;

When I added tabel with academic degrees I moved to different solution.

var lecturers = _context.Lecturer;
var degree = _context.AcademicDegrees;
var lecturersList = new List<SelectListItem>();

foreach (Lecturers l in lecturers)
{
    _context.AcademicDegrees.Where(d => d.AcademicDegreeId == l.AcademicDegreesId).Load();
    foreach(AcademicDegrees d in degree)
    {
        lecturersList.Add(new SelectListItem(
                  $"{d.Name} {l.FirstName} {l.LastName}", l.LecturersID.ToString()
             ));
        }
    }

ViewData["LecturersId"] = new SelectList(lecturersList);

The problem is that it isn't interpreted as I want it to be.

result

I also can't put it directly in to SelectList because it doesn't have empty constructor or add method. Is there any other way to implement a SelectList?

CodePudding user response:

In my opinion, it is like redundant work as you have the IEnumerable<SelectListItem> instance which can be used to build the select option.

And you pass IEnumerable<SelectListItem> instance to create the SelectList instance.

Would suggest to pass IEnumerable<SelectListItem> value to ViewData.

Solution for IEnumerable<SelectListItem>

Controller

ViewData["LecturersId"] = lecturersList;

View

@Html.DropDownListFor(model => model./*YourProperty*/, (IEnumerable<SelectListItem>)ViewData["LecturersId"])

Solution for SelectList

If you are keen on the SelectList, make sure that you have provided the dataValueField and dataTextField according to this constructor

public SelectList (System.Collections.IEnumerable items, string dataValueField, string dataTextField);

as below:

ViewData["LecturersId"] = new SelectList(lecturersList, "Value", "Text");

Besides, the query part would be suggested to optimize by joining both tables as below:

var lecturersList = (from a in _context.Lecturer
    join b in _context.AcademicDegrees on a.AcademicDegreeId equals b.AcademicDegreeId
    select new SelectListItem($"{b.Name} {a.FirstName} {a.LastName}", a.LecturersID.ToString())
).ToList();
  • Related