Я передаю строку обратно в мой контроллер, а затем пытаюсь сделать какой-то необработанный sql на платформе сущности.

Я использовал linq, но столкнулся с чем-то, что мне нужно написать быстро, поэтому я пытаюсь заставить работать сырой sql. Это мой первый проект в MVC, так что я новичок, но вот мой код контроллера

public ActionResult Index(string Vendors)
    {
        if (Vendors != "")
        {


            string query = "SELECT V.VENDOR_NAME, SUM(POL.ORDER_QTY * POL.UNIT_PRICE) AS AMOUNT_SPENT, MONTH(PO.ORDER_DATE) AS MO, YEAR(PO.ORDER_DATE) AS YR, M.ITEM_TYPE AS ITEM_TYPE "
                            + "FROM PO_LINE POL"
                            + "JOIN PURCH_ORD PO ON PO.PO_NUM = POL.PO_NUM"
                            + "JOIN VENDOR V ON V.VENDOR_ID = PO.VENDOR_ID"
                            + "JOIN MATERIAL M ON M.ITEM_ID = POL.ITEM_ID"
                            + "WHERE V.VENDOR_NAME =" + Vendors
                            + "GROUP BY V.VENDOR_NAME, M.ITEM_TYPE, YEAR(PO.ORDER_DATE), MONTH(PO.ORDER_DATE)"
                            + "ORDER BY V.VENDOR_NAME";

            var data = db.Database.SqlQuery<Reports>(query);
            ViewBag.Vendors = new SelectList(db.Vendors, "VENDOR_NAME", "VENDOR_NAME");
            return View(query.ToList());
        }

это мой модальный код

           using System;
           using System.Collections.Generic;
           using System.Linq;
           using System.Text;


           namespace GreenfieldGroup2.Models.Reports
      {
         public class Reports
     {
    public string VENDOR_NAME { get; set; }
    public decimal AMOUNT_SPENT { get; set; }
    public string ITEM_TYPE { get; set; }
    public DateTime ORDER_DATE { get; set; }
    public string ITEM_NAME { get; set; }
    public int STOCK_QTY { get; set; }
    public string WARD_NAME { get; set; }
    public string WARD_LOCATION { get; set; }
    public int ITEM_ID { get; set; }
    public DateTime DEL_DATE { get; set; }
}

}

Элемент модели, передаваемый в словарь, имеет тип 'System.Collections.Generic.List1[System.Char]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable1 [GreenfieldGroup2.Models.Reports.Reports]".

это моя ошибка, я не уверен, что это значит. Ниже мой взгляд код

         @model IEnumerable<GreenfieldGroup2.Models.Reports.Reports>
      @{
         ViewBag.Title = "Index";
      }

     <br />
       <head>

<style>
    body {
    padding-top: 100px
    }
</style>
  </head>

    <body>
   @using (Html.BeginForm("Index", "PurchasingReport", FormMethod.Get))
    {
       <table>
           <tr>
    <td align="left"><text>Select a Vendor:</text>

    </td>
    <td align="left">@Html.DropDownList("Vendors", "All Vendords")</td>

</tr>
<tr>
    <td align="Left">
        <input type="submit" value="submit" onsubmit="return Verify()"/>
    </td>
</tr>

</table>
}
<table border="1">
<tr>
   <th>

        @Html.DisplayNameFor(model => model.VENDOR_NAME)
       </th>

    <th>
        @Html.DisplayNameFor(model => model.AMOUNT_SPENT)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.ITEM_TYPE)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.ORDER_DATE)
    </th>


</tr>

@foreach (var item in Model)
{
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.VENDOR_NAME)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.AMOUNT_SPENT)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.ITEM_TYPE)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.ORDER_DATE)
        </td>

    </tr>
}
 </table>


 </body>

любая помощь с будет признателен за это для школьного проекта

3 ответа

Решение

Вы должны изменить свою декларацию

return View(query.ToList());

к следующему:

return View(data);

Как я понимаю из кода, который вы разместили ниже

var data = db.Database.SqlQuery<Reports>(query);

Вы назначаете ссылку на последовательность Reportsвозражает против data, Другими словами, тип data является IEnumerable<GreenfieldGroup2.Models.Reports.Reports> как я могу вывести из вашего кода.

Так что это нужно передать в View, а не в оператор sql, который является просто строкой.

Если вы посмотрите на ваше представление, оно ожидает "@model IEnumerable", и параметр, который вы передаете для просмотра, является запросом, который вы выполняете в базе данных, а не передачей запроса, передающего список, который будет работать отлично и не даст вам выше ошибка.

Благодарю.

Это было мое окончательное решение, так что, если кто-то столкнется с этой проблемой, она работает отлично и без инъекций SQL

        if (Vendors == null) { Vendors = ""; }
            if(Vendors == "") { Vendors = DBNull.Value.ToString(); }

            var @Vendor = new SqlParameter("@Vendor", Vendors);

            string query = "SELECT V.VENDOR_NAME, SUM(POL.ORDER_QTY * POL.UNIT_PRICE) AS AMOUNT_SPENT, MONTH(PO.ORDER_DATE) AS MO, YEAR(PO.ORDER_DATE) AS YR, M.ITEM_TYPE AS ITEM_TYPE "
                + "FROM PO_LINE POL "
                + "JOIN PURCH_ORD PO ON PO.PO_NUM = POL.PO_NUM "
                + "JOIN VENDOR V ON V.VENDOR_ID = PO.VENDOR_ID "
                + "JOIN MATERIAL M ON M.ITEM_ID = POL.ITEM_ID ";

            if (Vendors != "")
            {
                query += "WHERE V.VENDOR_NAME = @Vendor ";
            }

            query += "GROUP BY V.VENDOR_NAME, M.ITEM_TYPE, YEAR(PO.ORDER_DATE), MONTH(PO.ORDER_DATE) "
                + "ORDER BY V.VENDOR_NAME";


            if (Vendors != "")
            {
                var data = db.Database.SqlQuery<Reports>(query, @Vendor);
                return View(data.ToList());
            }
            else
            {
                var data = db.Database.SqlQuery<Reports>(query);
                return View(data.ToList());
            }
Другие вопросы по тегам