MVC LINQ to SQL表连接记录显示

时间:2008-11-10 19:49:55

标签: asp.net-mvc linq linq-to-sql join html-helper

在将viewdata传递给用户控件时,我在向视图显示记录时遇到问题。 这对于我正在使用表连接的linq到sql对象来说是显而易见的。

我收到的异常是“无法转换类型的对象”<> f__AnonymousType4 10[System.String,System.Int32,System.Nullable 1 [System.DateTime],System.String,System.String,System.String,System.String,System .String,System.Nullable 1[System.Single],System.Nullable 1 [System.Double]]'输入App.Models.table1。“

我已经找到了解决这个问题的方法但不太熟悉我这里找错了什么错误来搜索正确的主题。这应该是理论上的工作,这适用于单表检索,但当我在他们添加一个连接我遇到了问题。我目前正在使用foreach语句通过单表声明查询我的数据。任何帮助将不胜感激。提前谢谢。

我目前的设置是:

CViewDataUC.cs(我的类专门为用户控件保存viewdata和数据连接)

public void Info(ViewDataDictionary viewData, int id)
    {
        var dataContext = new testDataContext();

        var info = from table1 in dataContext.table1
                   join table2 in dataContext.table2 on table1.type_id equals table2.type_id
                   join table3 in dataContext.table3 on table1.id equals table3.id
                   join table4 in dataContext.table4 on table1.id equals table4.id
                   where table1.id == id
                   select new
                   {
                       table1.column1,
                       table1.column2,
                       table1.column3,
                       table1.column4,
                       table1.column5,
                       table1.column6,
                       table1.column7,
                       table2.column1,
                       table3.column1,
                       table4.column1
                   };         

        viewData["vd_Info"] = info;

    }

HomeController.cs(控制器)

public ActionResult Information(int id)
        {
            ViewData["Title"] = "Information";


            CViewDataUC o_info = new CViewDataUC();

            o_info.Info(this.ViewData, id);


            return View();
        }

Information.aspx(查看)

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true"
    CodeBehind="Info.aspx.cs" Inherits="App.Views.Info" %>

<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
    <%Html.RenderPartial("~/Views/UserControls/Info.ascx", ViewData["vd_Info"]);%>
</asp:Content>

Info.ascx(用户控制)

<%foreach (table1 m in (IEnumerable)ViewData.Model)
  { %>
<div class="left">
    <br />
    <br />
    <p id="medium">
        Column 1
        <br />
        <%= Html.TextBox("column1", m.column1, new {@class = "textBox", @readonly = "readonly" })%>
        Column 1
        <br />
        <%= Html.TextBox("column2", m.column2, new {@class = "textBox", @readonly = "readonly" })%>
        <br />
        Column 1
        <br />
        <%= Html.TextBox("column3", m.column3, new {@class = "textBox", @readonly = "readonly" })%>
                </p>
</div>
<%}%>

3 个答案:

答案 0 :(得分:3)

foreach (table1 m in (IEnumerable)ViewData.Model)

m不属于table1类型。它是一个匿名类型(CViewDataUC.cs中为select new { ... })。

您应该创建一个类,表示从控制器传递到视图的模型对象的类型。

答案 1 :(得分:2)

谢谢,这就像一个魅力。我完全忽视了这个问题,我猜这是周一的原因:P。但对于运行相同问题且仍然是MVC和LINQ to SQL新手的人来说,问题很容易解决,请执行以下步骤:

  1. 创建一个类CInformation.cs添加与查询类似的变量

    公共课C信息 {

    public CInformation() { }
    
    public string _column1{ get; set; }
    public string _column2{ get; set; }
    ...
    

    }

  2. 在您的查询中

    public void uc_VDGenInfoDC(ViewDataDictionary viewData,int id)     {

        var dataContext = new testDataContext();
    
        IQueryable<CInformation> info = from table1 in dataContext.table1
                                        join table2 in dataContext.table2 on table1.type_id equals table2.type_id        
                                        join table3 in dataContext.table3 on table1.id equals table3.id                  
                                        join table4 in dataContext.table4 on table1.id equals table4.id                       
                   where table1.test_id == id
                   select new CInformation
                   {
                       _column1 = table1.column1.ToString(),
                       _column2 = table2.column1.ToString(),
                       ...
                   };         
    
        viewData["vd_Info"] = info;
    
    }
    
  3. 在您的用户控制或视图中

    foreach(CInformation m in(IEnumerable)ViewData.Model){

     m.column1
     m.column2
     ...
    

    }

答案 2 :(得分:1)

谢谢,这对我帮助很大!

一个小评论,你必须使用尖括号:

IQueryable<CInformation> info = from table1 in dataContext.table1