none
關於Mvc linq 結果輸出轉型 RRS feed

  • 問題

  • 各位大大好:

    我最近在學MVC 但一直遇到linq 結果輸出問題至view 這一段有問題,

    嘗試了使用asEnumerable(),ToList() 輸出,用IEnumerable<ProductListResultViewModel2>或List<ProductListResultViewModel2> 去接值 然後再傳至view 一直抱錯,但是這方面的錯誤實在不懂怎麼Google,

    所以來請問大大,可以的話 也能告訴我一些觀念 或資源也行 感謝  !!

    錯誤訊息:

    'System.Collections.Generic.List`1[<>f__AnonymousType5`8[System.Int32,System.String,System.String,System.String,System.Nullable`1[System.Byte],System.Int32,System.Nullable`1[System.Int32],System.Nullable`1[System.DateTime]]]',但是此字典需要型別 'System.Collections.Generic.List`1[ShoppingEx.Models.ViewModels.ProductListResultViewModel2]'

    ProductController.cs

            public ActionResult ListResult()
            {
                // IEnumerable<ProductListResultViewModel2> 
               var vResult = (from p in db.Product
                              join c in db.Company on p.Company_Id equals c.Company_Id into ps
                              from o in ps.DefaultIfEmpty()
                              join pt in db.ProductType on p.ProductType_Id equals pt.ProductType_id into pst
                              from o2 in pst.DefaultIfEmpty()                          select new { p.Product_id, p.Product_Name, o.Company_Name, o2.ProductType_Name,p.Status,p.Quantity,p.Unit }).ToList();
    
                return View(vResult);
    
            }

    ListResult.cshtml

    @model List<ShoppingEx.Models.ViewModels.ProductListResultViewModel2>
    
    @{
        ViewBag.Title = "ListResult";
    }
    
    <h2>ListResult</h2>
    
    @using (Html.BeginForm("PostListResult", "Product", FormMethod.Post))
    {
        <table class="table">
            <thead>查詢</thead>
            @*<tr><th>產品名稱</th><td>@Html.TextBoxFor(m => model..)</td></tr>*@
            @*<tr><th>公司名稱</th><td>@Html.TextBoxFor()</td></tr>*@
            <tr><th>產品名稱</th><td><input type="text" name="txtPName" /> </td></tr>
            <tr><th>公司名稱</th><td><input type="text" name="txtCompany" /> </td></tr>
            <tr><th></th><td><input type="submit" value="查詢" /> </td></tr>
        </table>
    
    
        <table class="table">
            <tr>
                <th>序號</th>
                <th>產品名稱</th>
                <th>公司名稱</th>
                <th>單價</th>
                <th>數量</th>
                <th>啟用</th>
            </tr>
            @foreach (var item in Model)
            {
    
                <tr>
                    <td>@item.Product_id</td>
                    <td>@item.Product_Name</td>
                    <td>@item.Company_Name</td>
                    <td>@item.ProductType_Name</td>
                    <td>@item.Unit</td>
                    <td>@item.Quantity</td>
                    <td>@item.Status</td>
                    <td>@Html.ActionLink("編輯", "EditItemIndex", new { id = item.Product_id })</td>
                    <td>@Html.ActionLink("刪除", "DelItemIndex", new { id = item.Product_id })</td>
                </tr>
            }
            <tr></tr>
        </table>
    }

    ProductListResultViewModel2.cs

        public class ProductListResultViewModel2
        {
            public int Product_id { get; set; }
    
            public string Product_Name { get; set; }
    
            public string ProductType_Name { get; set; }
    
            public string Remark { get; set; }
    
            public string Company_Name { get; set; }
    
            public byte? Status { get; set; }
    
            public int Quantity { get; set; }
    
            public DateTime? add_date { get; set; }
    
            public int? Unit { get; set; }
        }


    • 已編輯 zongyi 2018年5月5日 上午 08:05
    2018年5月5日 上午 08:00

解答

  • 如果你一定要套一個固定型態,就要回傳該型態的集合物件。

    也就是你的 select new 要改寫成產生 ProductListResultViewModel2 的物件,你現在的寫法是產生匿名物件。


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    • 已標示為解答 zongyi 2018年5月6日 上午 10:54
    2018年5月5日 上午 10:32
    版主
  • 將:

    select new { p.Product_id, p.Product_Name, o.Company_Name, o2.ProductType_Name,p.Status,p.Quantity,p.Unit }).ToList();

    改成:

    select newProductListResultViewModel2{ Product_id=p.Product_id, Product_Name=p.Product_Name, ProductType_Name = o2.ProductType_Name, Company_Name=o.Company_Name, Status=p.Status,Quantity=p.Quantity,Unit =p.Unit }).ToList();

    再試看看

    • 已標示為解答 zongyi 2018年5月6日 上午 10:49
    2018年5月5日 上午 11:12

所有回覆

  • 如果你一定要套一個固定型態,就要回傳該型態的集合物件。

    也就是你的 select new 要改寫成產生 ProductListResultViewModel2 的物件,你現在的寫法是產生匿名物件。


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    • 已標示為解答 zongyi 2018年5月6日 上午 10:54
    2018年5月5日 上午 10:32
    版主
  • 將:

    select new { p.Product_id, p.Product_Name, o.Company_Name, o2.ProductType_Name,p.Status,p.Quantity,p.Unit }).ToList();

    改成:

    select newProductListResultViewModel2{ Product_id=p.Product_id, Product_Name=p.Product_Name, ProductType_Name = o2.ProductType_Name, Company_Name=o.Company_Name, Status=p.Status,Quantity=p.Quantity,Unit =p.Unit }).ToList();

    再試看看

    • 已標示為解答 zongyi 2018年5月6日 上午 10:49
    2018年5月5日 上午 11:12
  • 感謝this 和小朱 解決了!!

      想問一下 那如果要產生匿名物件傳至view該怎麼寫??


    2018年5月6日 上午 10:53
  • 您可以參考這篇討論的做法:

    Can I pass an anonymous type to my ASP.NET MVC view?

    2018年5月6日 上午 11:24
  • 好的 謝謝
    2018年5月7日 下午 12:56