Значения таблицы базы данных ASP.NET MVC "один-ко-многим" с атрибутом списка

Моя первая таблица:

Имя первой таблицы: Контакты
ContactID (PK)
Имя
Фамилия
Компания

Имя второй таблицы: телефоны
ContactID (FK)
PhoneType
PhoneNumber

Моя модель просмотра

public class ContactVM2
{
    public int ContactID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Company { get; set; }

    public string PhoneType { get; set; }
    public string PhoneNumber { get; set; }
}

Класс репозитория

public class ContactRepository
{
    ContactsDBEntities dbRepo = new ContactsDBEntities();

    public List<ContactVM> GetAllContacts()
    {
        List<ContactVM> ContactViewList = new List<ContactVM>();

        var allContacts = dbRepo.Contacts.ToList();
        var allPhones = dbRepo.Phones.ToList();

        foreach (var cont in allContacts)
        {
            foreach (var ph in allPhones)
            {
                if (cont.ContactID == ph.ContactID)
                {
                    ContactViewList.Add(new ContactVM(){
                        ContactID =cont.ContactID,
                        FirstName=cont.FirstName,
                        LastName=cont.LastName,
                        Company=cont.Company,
                        PhoneType=ph.PhoneType,
                        PhoneNumber=ph.PhoneNumber});
                }
            }
        }

        return ContactViewList;
    }        
}

и Контроллер

public ActionResult Index()
    {
        ContactRepository contRepo = new ContactRepository();

        var allContacts = contRepo.GetAllContacts().ToList();

        return View(allContacts);
    }

У меня есть следующие данные в таблицах контактов
ContactID FirstName LastName Company
1 Bill Gates Microsoft

и в таблице телефонов
ContactID PhoneType PhoneNumber
1 Home 1111
1 Office 2222

Я получаю следующий результат: 1 Дом Билла Гейтса 1111
1 Офис Билла Гейтса 2222

Контактные данные повторяются.
Мне нужен следующий результат
1 Bill Gates Home 1111
Office 2222
Я также пробовал отслеживать изменения в представлении

 <td style="border:2px solid Blue;">
        @{
        foreach (var parent in Model.Where(x=>x.ContactID==item.ContactID).GroupBy(m=>m.PhoneNumber))
       {   
          foreach( var itm in parent )
           {                
             @itm.PhoneNumber <br />
          }    
          } 
          }
    </td>
    <td style="border:2px solid red;">
        @{
        foreach (var parent in Model.Where(x=>x.ContactID==item.ContactID).GroupBy(m=>m.PhoneType))
       {   
          foreach( var itm in parent )
           {                
             @itm.PhoneType <br />
          }    
          } 
          }
    </td>

Но он по-прежнему повторяет запись снова.
Затем я попробовал внести изменения в ModelView

    public List<string> PhoneType { get; set; }
    public List<string> PhoneNumber { get; set; }

но не получил результатов.
Может ли кто-нибудь помочь, приведя простейший пример, поскольку я нахожусь на очень начальном уровне. Код без итерации по телефону в представлении

@foreach (var item in Model) {
<tr>
    <td>
        @Html.DisplayFor(modelItem => item.ContactID)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.FirstName)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.LastName)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.Company)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.PhoneType)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.PhoneNumber)
    </td>
    <td>
        @Html.ActionLink("Edit", "Edit", new { /* id=item.PrimaryKey */ }) |
        @Html.ActionLink("Details", "Details", new { /* id=item.PrimaryKey */ }) |
        @Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ })
    </td>
</tr>

person Muhammad    schedule 31.07.2013    source источник
comment
Вы повторяете цикл «Телефон». Итак, для идентификатора 1 было два телефонных номера. Итак, две строки повторяются.   -  person Deepak.Aggrawal    schedule 31.07.2013
comment
Я пробовал без итераций, все равно дважды получаю контактные данные.   -  person Muhammad    schedule 31.07.2013
comment
Можете ли вы также добавить этот код?   -  person Deepak.Aggrawal    schedule 31.07.2013
comment
@ Deepak.Aggrawal Код без итерации добавлен внизу.   -  person Muhammad    schedule 31.07.2013


Ответы (1)


Вы должны удалить итерацию из класса репозитория и создать отдельный класс для номера телефона и добавить переменную этого класса в ContactVM2, как в модели ниже:

public class ContactVM2
{
    public int ContactID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Company { get; set; }
    public List<ContactVM2Phone> PhoneList {get; set;}

}
public class ContactVM2Phone
{
    public string PhoneType { get; set; }
    public string PhoneNumber { get; set; }
}

Класс репозитория

public class ContactRepository
{
    ContactsDBEntities dbRepo = new ContactsDBEntities();

    public List<ContactVM> GetAllContacts()
    {
        List<ContactVM> ContactViewList = new List<ContactVM>();


        var allContacts = dbRepo.Contacts.ToList();
        var allPhones = dbRepo.Phones.ToList();

        foreach (var cont in allContacts)
        {
          ContactViewList obj=   new ContactVM()
           obj.ContactID =cont.ContactID;
           obj.FirstName=cont.FirstName;
           obj.LastName=cont.LastName;
           obj.Company=cont.Company;
           List<ContactVM2Phone> Phonelist= new List<ContactVM2Phone>();
            foreach (var ph in allPhones)
            {
                if (cont.ContactID == ph.ContactID)
                {
                    Phonelist.Add(new ContactVM2Phone(){
                        PhoneType=ph.PhoneType,
                        PhoneNumber=ph.PhoneNumber});
                }
            }
           obj.PhoneList =Phonelist;
           ContactViewList.Add(obj);
        }

        return ContactViewList;
    }        
}
person Deepak.Aggrawal    schedule 31.07.2013
comment
как заполнить список в этом случае? - person Muhammad; 31.07.2013
comment
Обновил ответ. Я не запускал этот код, поэтому проверьте, нет ли мелких ошибок. - person Deepak.Aggrawal; 31.07.2013
comment
Я это проверяю. Спасибо - person Muhammad; 31.07.2013
comment
Он повторяет все телефонные номера в db в каждой строке, и все записи повторяются снова и снова. - person Muhammad; 31.07.2013