MVC LINQ to SQLテーブル結合レコードの表示
-
07-07-2019 - |
質問
viewdataをユーザーコントロールに渡すときに、ビューにレコードを表示するときに問題が発生します。 これは、テーブル結合を使用しているlinq to sqlオブジェクトでのみ明らかです。
受け取った例外は、<!> quot;タイプ '<!> lt; <!> gt; 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。<!> quot;
この問題の修正を検索しましたが、ここで何が間違っているのかよく知らず、適切な主題を検索できません。これは理論的には機能するはずであり、これは単一のテーブルの取得に対して機能しますが、結合を追加すると問題に遭遇しました。現在、foreachステートメントを使用して、単一のテーブル宣言を介してデータを照会しています。どんな助けも大歓迎です。事前に感謝します。
現在の設定:
CViewDataUC.cs(ユーザーコントロール専用のビューデータとデータ接続を保持するためのクラス)
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(Controller)
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>
<%}%>
解決
foreach (table1 m in (IEnumerable)ViewData.Model)
m
はタイプtable1
ではありません。これは匿名型です(CViewDataUC.csのselect new { ... }
)。
コントローラからビューに渡すモデルオブジェクトのタイプを表すクラスを作成する必要があります。
他のヒント
ありがとう、それは魅力のように働いた。私は問題を完全に見落としていました。月曜日だからだと思います:P。しかし、同じ問題で実行され、MVCとLINQ to SQLがまだ初めての人にとっては、これらの手順を実行することで問題を簡単に解決できます。
-
クラスCInformation.csを作成するクエリに類似した変数を追加する
パブリッククラスCInformation {
public CInformation() { } public string _column1{ get; set; } public string _column2{ get; set; } ...
}
-
クエリ内
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; }
-
ユーザーコントロールまたはビューで
foreach((IEnumerable)ViewData.ModelのCInformation m){
m.column1 m.column2 ...
}
ありがとう、これは私を大いに助けてくれました!
1つの小さなコメント、山かっこを使用する必要があります:
IQueryable<CInformation> info = from table1 in dataContext.table1