ASP.NET MVC2:来自join的IQueryable

时间:2010-12-29 14:59:16

标签: c# .net asp.net asp.net-mvc-2 anonymous-types

在我的控制器类中,我必须加入两个表:

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 个答案:

答案 0 :(得分:4)

这是匿名类型的缺点。一旦您超出了创建它的范围,就不会有一种简单的方法来访问其成员而不使用反射。

我的建议是创建另一个具有视图所需信息的类(视图模型),并用查询结果填充它。这样您就可以访问所有内容,因为您使用的类型不再是匿名类型。

答案 1 :(得分: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};