Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我将一个字符串传递回我的控制器,然后尝试在实体框架上执行一些原始sql。_C#_Asp.net Mvc_Entity Framework_Rawsql - Fatal编程技术网

C# 我将一个字符串传递回我的控制器,然后尝试在实体框架上执行一些原始sql。

C# 我将一个字符串传递回我的控制器,然后尝试在实体框架上执行一些原始sql。,c#,asp.net-mvc,entity-framework,rawsql,C#,Asp.net Mvc,Entity Framework,Rawsql,我使用的是linq,但我遇到了一些需要快速编写的东西,所以我正在尝试让原始sql正常工作。这是我在mvc中的第一个项目,所以我是一个新手,但这是我的控制器代码 public ActionResult Index(string Vendors) { if (Vendors != "") { string query = "SELECT V.VENDOR_NAME, SUM(POL.ORDER_QTY * POL.UNIT_PRIC

我使用的是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());
        }
}

传入字典的模型项的类型为“System.Collections.Generic.List
1[System.Char]”,但此字典需要类型为“System.Collections.Generic.IEnumerable
1[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>
@model IEnumerable
@{
ViewBag.Title=“Index”;
}

身体{ 填充顶部:100px } @使用(Html.BeginForm(“Index”,“PurchasingReport”,FormMethod.Get)) { 选择供应商: @Html.DropDownList(“供应商”、“所有供应商”) } @DisplayNameFor(model=>model.VENDOR\u NAME) @Html.DisplayNameFor(model=>model.AMOUNT\u花费) @DisplayNameFor(model=>model.ITEM\u类型) @Html.DisplayNameFor(model=>model.ORDER\u日期) @foreach(模型中的var项目) { @DisplayFor(modelItem=>item.VENDOR\u NAME) @Html.DisplayFor(modelItem=>item.AMOUNT\u花费) @DisplayFor(modelItem=>item.item\u类型) @DisplayFor(modelItem=>item.ORDER\u日期) }

如果您有任何帮助,我们将不胜感激。这是一个学校项目

您应该更改您的回报声明

return View(query.ToList());
对下列事项:

return View(data);
正如我从你发布的代码中了解到的,如下所示

var data = db.Database.SqlQuery<Reports>(query);
var data=db.Database.SqlQuery(查询);
将对
报告
对象序列的引用指定给
数据
。换句话说,
数据
的类型是
IEnumerable
,我可以从您的代码中推断出来


因此,这需要传递给视图,而不是sql语句,sql语句只是一个字符串。

您应该更改返回语句

return View(query.ToList());
对下列事项:

return View(data);
正如我从你发布的代码中了解到的,如下所示

var data = db.Database.SqlQuery<Reports>(query);
var data=db.Database.SqlQuery(查询);
将对
报告
对象序列的引用指定给
数据
。换句话说,
数据
的类型是
IEnumerable
,我可以从您的代码中推断出来


因此,这需要传递给视图,而不是sql语句,sql语句只是一个字符串。

如果查看视图,它需要“@model IEnumerable”,而传递给视图的参数是您正在数据库上执行的查询,而不是传递查询传递给列表,这将完美地工作,不会给你上述错误


谢谢。

如果您查看您的视图,它需要“@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());
            }
if(Vendors==null){Vendors=”“;}
if(Vendors==“”){Vendors=DBNull.Value.ToString();}
var@Vendor=新的SqlParameter(“@Vendor”,Vendors);
string query=“选择供应商名称、金额(采购订单数量*采购单价)作为支出金额、月(采购订单日期)作为生产任务、年(采购订单日期)作为年、M项目类型作为项目类型”
+“从PO_LINE POL”
+“在PO.PO\u NUM=POL.PO\u NUM上加入采购订单”
+“在V.VENDOR\u ID=PO.VENDOR\u ID上加入供应商V”
+“在M.ITEM_ID=POL.ITEM_ID上连接物料M”;
如果(供应商!=“”)
{
查询+=“其中V.VENDOR\u NAME=@VENDOR”;
}
查询+=“按供应商名称、物料类型、年份(采购订单订单日期)、月份(采购订单订单日期)分组”
+“按供应商名称订购”;
如果(供应商!=“”)
{
var data=db.Database.SqlQuery(query,@Vendor);
返回视图(data.ToList());
}
其他的
{
var data=db.Database.SqlQuery(查询);
返回视图(data.ToList());
}

这是我的最终解决方案,因此,如果其他任何人遇到此问题,它可以完美地工作,并且没有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());
            }
if(Vendors==null){Vendors=”“;}
if(Vendors==“”){Vendors=DBNull.Value.ToString();}
var@Vendor=新的SqlParameter(“@Vendor”,Vendors);
string query=“选择供应商名称、金额(采购订单数量*采购单价)作为支出金额、月(采购订单日期)作为生产任务、年(采购订单日期)作为年、M项目类型作为项目类型”
+“从PO_LINE POL”
+“在PO.PO\u NUM=POL.PO\u NUM上加入采购订单”
+“在V.VENDOR\u ID=PO.VENDOR\u ID上加入供应商V”
+“在M.ITEM_ID=POL.ITEM_ID上连接物料M”;
如果(供应商!=“”)
{
查询+=“其中V.VENDOR\u NAME=@VENDOR”;
}
查询+=“按供应商名称、物料类型、年份(采购订单订单日期)、月份(采购订单订单日期)分组”
+“按供应商名称订购”;
如果(供应商!=“”)
{
var data=db.Database.SqlQuery(query,@Vendor);
返回视图(data.ToList());
}
其他的
{
var data=db.Database.SqlQuery(查询);
返回视图(data.ToList());
}
SQL语句的每行末尾至少应有一个空格