【问题标题】:mvc 3 - Model with multiple IEnumerablemvc 3 - 具有多个 IEnumerable 的模型
【发布时间】:2012-05-27 02:11:27
【问题描述】:

我正在寻找解决问题的最佳方法。

我只需要显示 3 个不同实体的名称,而不是其余信息。

实体是:

db.TR{TRID, ProjectID, TemplateID, version}
db.Project{ProjectID, ProjectName}
db.Template{TemplateID, TemplateName}

我想要在这样的网格中显示所有结果的最佳方法:

TRID - ProjectName - TemplateName - Version

我想知道您将如何处理模型、控制器(索引函数)和视图。

到目前为止,我的 View 函数如下所示:

public ViewResult Index()  
{  
    var viewModel = from tr in db.TRs   
    join proj in db.Projects on tr.ProjectID equals proj.ProjectID   
    join templ in db.Templates on tr.TemplateID equals templ.TemplateID  
    orderby proj.ProjectName  
    select new  
    {  
        TRList = tr.TRID,  
        TemplateList = templ.TemplateName,  
        ProjectList = proj.ProjectName,  
        Version = tr.version  
    }   
    return View(viewModel); //Go in Index.cshtml  
}

视图是:

@model IEnumerable <OnlineTR.WebUI.Areas.Admin.Models.TRManagerModel>  
@foreach (var item in Model)  
             {
            <tr>  
                <td>  
                   @Html.DisplayFor(modelitem => item.TRList);  
                </td>  
                <td>  
                   @Html.DisplayFor(modelitem => item.ProjectList);  
                </td>  
                <td>  
                   @Html.DisplayFor(modelitem => item.TemplateList);  
                </td>  
            </tr>  
            }

我正在尝试找到一种方法来使用仅使用我需要的 sql 请求。

如果你能告诉我如何使用 .include,那就太棒了。到目前为止,我已经尝试过了,但它不接受 () 中的 lambda 表达式,它需要一个字符串路径。 (可能缺少使用?)

非常感谢。亚历克斯。

【问题讨论】:

  • 你的问题不是很清楚。你还没有完全定义你的问题是什么。您说“它不接受 () 中的 lambda 表达式”。什么没有? () 是什么?如果您有错误,请包括在内。
  • 要将 Include() 与 lambda 表达式一起使用,您需要 using System.Data.Entity;。但尚不清楚它与您正在解决的问题有何关系。请澄清您的问题。
  • 抱歉。我做了 db.TR.Include(x => x.Project) 编译时出错。它说它期待一个字符串路径作为参数。像 db.TR.Include("Project") 。这个东西建好了,但是返回 NULL。

标签: asp.net-mvc-3 ienumerable inner-join


【解决方案1】:

您的代码的问题是您将匿名类型的 IEnumerable 传递给您的视图,但它需要该类型

@model IEnumerable <OnlineTR.WebUI.Areas.Admin.Models.TRManagerModel>

修复您的 LINQ 查询以选择具体类型,它会起作用

select new TRManagerModel
    {  
        TRList = tr.TRID,  
        TemplateList = templ.TemplateName,  
        ProjectList = proj.ProjectName,  
        Version = tr.version  
    }   

【讨论】:

  • 您好,谢谢您的回答。我能够解决我的问题。我已经修复了 LINQ 查询。但我的问题更多:您将如何解决这个问题?你会使用相同类型的查询吗?或者你会使用像 .include 这样的函数吗?你会使用不同的模型吗?像我这样的“新手”的问题在于,我得到了我想要的结果,但我永远不太确定这是否是最好的方法。所以任何新的想法都非常受欢迎。另外,就像我说的,我尝试使用 .include (对我来说看起来更干净!:))但它不起作用。它正在寻找一个字符串路径(不是 lambda)。
  • Include() 将整个实体加载到内存中并提供更改跟踪。在您的情况下,两者都意味着不必要的开销。如果您不想修改模型,则使用投影(即选择语句)是最佳解决方案。奇怪的是您的解决方案是连接。如果模型定义正确,您可以使用导航属性而不是手动加入实体。
  • 感谢答案。我期待了解有关导航属性的更多信息。
猜你喜欢
  • 1970-01-01
  • 2011-11-20
  • 1970-01-01
  • 2011-07-30
  • 2011-08-14
  • 1970-01-01
  • 2020-06-29
  • 2021-05-13
  • 1970-01-01
相关资源
最近更新 更多