2016-11-22 4 views
0

Ich versuche, bestimmte Daten aus verschiedenen Tabellen basierend auf einigen Anforderungen zu erhalten, Das Programm soll einige Spalten der Auswahl aus Tabellen nehmen: Contatti, Kontakte und Firmen, die sind an verschiedenen Orten und bringen sie zusammen.asp.net mvc 5 erhalten verwandte Daten aus verschiedenen Tabellen

Kontakt wird an Unternehmen durch CompanyID verbunden

Was ich will, ist der Firmennamen auf dem CompanyID Feld in Kontakt Tabelle stützen anzuzeigen. Das Problem ist, dass ich durch eine Liste iteriere, um die Daten in der Ansicht zu erhalten, und deshalb kann ich nicht scheinen, einen Firmennamen zu erhalten, der auf dem Unternehmensidentifikationsattribut basiert, das der Kontakt-Fremdschlüssel zu der Unternehmenstabelle ist, was ich Get ist die Namen aller Unternehmen, weil sie in der gleichen Liste sind.

Ich bin sicher, es gibt eine einfache Möglichkeit, dies zu tun, aber dies ist eine neue Welt für mich, danke für jede Hilfe.

Kontakt Modell:

public class Contact 
{ 
[Key] 
public int ContactId { get; set; } 
public string Name { get; set; } 
public string Address { get; set; } 
public string City { get; set; } 
public string State { get; set; } 
public string Zip { get; set; } 
[DataType(DataType.EmailAddress)] 
public string Email { get; set; } 
[ForeignKey("Companies")] 
public int CompanyId { get; set; } 
public virtual ICollection<Companies> Companies { get; set; } 
[Required] 
//public virtual Contatti Contatti { get; set; } 
public virtual ICollection<Contatti> Contatti { get; set; } 
} 

Firmen Modell:

public class Companies 
{ 
[Key] 
public int CompanyId { get; set; } 
public string CompanyName { get; set; } 
public string CompanyAddress { get; set; } 
public string CompanyCity { get; set; } 
public string CompanyState { get; set; } 
public string CompanyZip { get; set; } 
public string CompanyArea { get; set; } 
} 

Controller:

public ActionResult Index(String Page) 
    { 

     ContactsUni2 CU = new ContactsUni2(); 
     CU.Contattis = db2.Contatti.ToList(); 
     CU.Contacts = db.Contacts.ToList(); 
     CU.Companies = db.Companies.ToList(); 
     List<ContactsUni2> contactlist = new List<ContactsUni2>(); 
     contactlist.Add(CU); 
     return View(contactlist); 
    } 

Ausblick:

@foreach (var item in Model) 
    { 
     for (int i = 0; i < item.Contacts.Count; i++) 
     { 
      <tr> 
       <td> 
        @item.Contacts[i].ContactId 
       </td> 
       <td> 
        @item.Contacts[i].Name 
       </td> 
       <td> 
        @item.Contacts[i].Address 
       </td> 
       <td> 
        @item.Contacts[i].CompanyId 
       </td> 
        @if (@item.Contacts[i].CompanyId == item.Companies[i].CompanyId) 
         { 
        <td> 
         @item.Companies[i].CompanyName 
        </td> 
        <td> 
         @item.Companies[i].CompanyCity 
        </td> 
        <td> 
         @item.Companies[i].CompanyArea 
        </td> 
         } 
        } 
       </tr> 
       <tr> 
        <td> 
         @item.Contattis[i].ContattoID 
        </td> 
        <td> 
         @item.Contattis[i].Nome 
        </td> 
        <td> 
         @item.Contattis[i].Citta 
        </td> 
        <td> 
         @item.Contattis[i].CodicePostale 
        </td> 
        <td> 
         @item.Contattis[i].Email 
        </td> 
      </tr> 


     } 
    } 

</table> 

</body> 
</html> 

Antwort

1

Sie können versuchen, die Unternehmenssammlung für jeden Ihrer Kontakte zu füllen und dann die Ansicht so zu korrigieren, dass sie direkt auf ihr eigenes Mitglied zugreift, anstatt sie in der Firmenliste zu suchen.

public ActionResult Index(String Page) 
{ 

    ContactsUni2 CU = new ContactsUni2(); 
    CU.Contattis = db2.Contatti.ToList(); 
    CU.Contacts = db.Contacts.ToList(); 
    CU.Companies = db.Companies.ToList(); 

    foreach(var contact in CU.Contacts) 
    { 
     contact.Companies = CU.Companies 
          .Where(com => com.CompanyId == contact.CompanyId) 
          .ToList(); 
    } 

    List<ContactsUni2> contactlist = new List<ContactsUni2>(); 
    contactlist.Add(CU); 
    return View(contactlist); 
} 

In der Ansicht können Sie ersetzen:

@if (@item.Contacts[i].CompanyId == item.Companies[i].CompanyId) 
{ 
    <td> 
    @item.Companies[i].CompanyName 
</td> 
<td> 
    @item.Companies[i].CompanyCity 
</td> 
<td> 
    @item.Companies[i].CompanyArea 
</td> 
} 

Damit so etwas wie: (Beachten Sie, dass die if-Anweisung entfernt wird)

<td> 
    @item.Contacts[i].Companies[0].CompanyName 
</td> 
<td> 
    @item.Contacts[i].Companies[0].CompanyCity 
</td> 
<td> 
    @item.Contacts[i].Companies[0].CompanyArea 
</td> 

EDIT: Seit ICollection unterstützt keine Indizes, die Firmensammlung sollte von

geändert werden
public virtual ICollection<Companies> Companies { get; set; } 

zu

public virtual IList<Companies> Companies { get; set; } 

oder jeder anderen Art von Sammlung unterstützen Indizes.

+0

Vielen Dank für den Vorschlag, die Ansicht funktioniert jedoch nicht für mich, erlaubt mir nicht, Unternehmen zu Unternehmen zu werfen, was ist die Idee hinter Companies [i] .Companies [0]? Könnten Sie den Code etwas genauer machen? Entschuldigen Sie die Umstände. – Dantuzzo

+0

Ups !, ich meinte Kontakte [i] .Companies [0], werde es beheben. Ich habe bemerkt, dass Sie eine Sammlung im Kontaktmodell verwenden, um Unternehmen zu verbinden, aber es scheint, dass die Absicht ist, nur eine Firma zu jedem Kontakt zu haben (das ist der Grund für .Companies [0]), zumindest ist das, was ich gelernt habe, als ich schaute bei Ihrem CompanyId Fremdschlüssel. –

+0

Ich sehe, es macht Sinn, aber es sagt, dass ich Indizierung mit [] nicht auf einen Ausdruck des Typs ICollection bei Kontakte [i] anwenden kann.Unternehmen [0], diese Umgebung ist eine echte primadonna – Dantuzzo

Verwandte Themen