2010-12-29 12 views
1

В моем классе контроллера я должен соединить две таблицы:ASP.NET MVC2: IQueryable из присоединиться

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

В представлении я пытаюсь вызвать значения, например:

<% foreach (var testCase in Model.SearchResults) 

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

Это приводит к ошибке:

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

Так что же я должен объявить вместо вара, чтобы иметь доступ к анонимно- тип? Я пробовал использовать LOGGER, который работает, однако, очевидно, он не дает мне доступ к TESTCASE.

Я ищу что-то вроде:

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

ответ

4

Это недостаток анонимных типов. Когда вы находитесь за пределами области, в которой он был создан, нет простого доступа к своим членам без использования рефлексии.

Мое предложение состояло в том, чтобы создать еще один класс, который имеет информацию, необходимую для представления (модель представления), и заполнить ее результатами запроса. Таким образом, вы сможете получить доступ ко всему, поскольку тип, с которым вы работаете, больше не является анонимным типом.

+0

Да, я подозревал, что это необходимо. Спасибо за ответ. – Chris

0

Я даже не пойму, должен ли вы делать Linq внутри контроллера. Да, я знаю, что большинство образцов показывают это, но это не очень хорошая практика.

Однако, чтобы решить вашу проблему, вам придется создать объект передачи данных. Что-то вроде:

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

Это сделало трюк. БЛАГОДАРЯ! – Chris