2010-12-29 11 views
1

In meinem Controller-Klasse I zwei Tabellen verknüpft haben:ASP.NET MVC2: IQueryable von beitreten

var query = from logger in database.LOGGERs 
         join testcase in database.TESTCASEs on logger.TCID equals testcase.TCID select new {logger, testcase}; 

Aus Sicht versuche ich, um die Werte zu nennen, zum Beispiel:

<% foreach (var testCase in Model.SearchResults) 

    <td width="200"title="<%= (testCase.SCRIPTNAME %>" 

Dies führt zu dem Fehler:

Unable to cast object of type '<>f__AnonymousType1`2[TestAutomationService.Models.LOGGER,TestAutomationService.Models.TESTCASE]' to type 'TestAutomationService.Models.LOGGER'. 

Also, was ich anstelle von var deklarieren, um die ANONYMOUS-Zugang Art? Ich habe versucht LOGGER zu benutzen, was funktioniert, aber es gibt mir offensichtlich keinen Zugang zu TESTCASE.

Ich bin auf der Suche nach so etwas wie:

foreach (IQuerable<{LOGGER, TESTCASE}> testCase in Model.SearchResults) 
... 

Antwort

4

Dies ist die Kehrseite der anonymen Typen. Sobald Sie sich außerhalb des Bereichs befinden, in dem es erstellt wurde, gibt es keine einfache Möglichkeit, ohne Reflektion auf seine Mitglieder zuzugreifen.

Mein Vorschlag würde sein, eine andere Klasse zu erstellen, die die Informationen hat, die die Ansicht benötigt (ein Ansichtsmodell), und sie mit den Ergebnissen der Abfrage auszufüllen. Auf diese Weise können Sie auf alles zugreifen, da der Typ, mit dem Sie arbeiten, kein anonymer Typ mehr ist.

+0

Ja, ich vermutete, dass das notwendig wäre. Danke für die Antwort. – Chris

0

Ich werde nicht einmal herausfinden, ob Sie Linq innerhalb des Controllers tun sollten. Ja, ich weiß, dass die meisten Beispiele das zeigen, aber es ist keine gute Übung.

Um jedoch Ihr Problem zu lösen, müssen Sie ein Datenübertragungsobjekt erstellen. Etwas wie:

class LoggerTestcase { 
    public Logger Logger {get;set;} 
    public Testcase Testcase {get;set;} 
} 

var query = from logger in database.LOGGERs 
    join testcase in database.TESTCASEs on logger.TCID equals 
    testcase.TCID select new LoggerTestcase {Logger = logger, Testcase = testcase}; 
+0

Das hat den Trick gemacht. VIELEN DANK! – Chris

Verwandte Themen