ASP.NET MVC2: IQueryable от объединения - PullRequest
1 голос
/ 29 декабря 2010

В моем классе контроллеров мне нужно объединить две таблицы:

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'.

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

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

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

Ответы [ 2 ]

4 голосов
/ 29 декабря 2010

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

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

0 голосов
/ 29 декабря 2010

Я даже не буду вдаваться в подробности, стоит ли вам выполнять 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};
...