C# Entity Framework 原始 SQL 查询

C# Entity Framework Raw SQL Query

尝试处理一个简单的 Web 应用程序,我在 Visual Studio 2017 年创建了一个项目,当我使用与 tables 对应的模型时,该项目运行良好(我遵循了教程: https://msdn.microsoft.com/en-us/library/jj206878(v=vs.113).aspx ).

我只想 运行 原始 sql 查询,这样我就可以处理结果,操作并写回另一个 table,或者只显示结果

在我的控制器中我有:

    public ActionResult RunQuery001()
    {
        string query = "SELECT @@VERSION";
        return View(db.Servers.SqlQuery(query).ToArray());
    }

我创建了一个如下所示的视图:

    @model IEnumerable<omfgshootmenow.Server>

    @{
        ViewBag.Title = "RunQuery001";
    }

    @foreach (var item in Model)
    {
        @Html.DisplayFor(model => item.ToString());
    }

代码构建但当我执行时出现异常:

Message=The data reader is incompatible with the specified (model here) A member of the type, 'id', does not have a corresponding column in the data reader 与同名

我一直认为视图是完全错误的(或者整个事情都是错误的),因为异常引用了模型的键列。

感谢任何帮助。

我很确定这是因为您的数据的形状与 Server 的类型不匹配。

当您查询 db.Servers 时,您必须 return 匹配服务器的内容。

如果您想 return 任何非实体类型,您应该改用 context.Database.SqlQuery。看这里:https://msdn.microsoft.com/en-us/library/jj592907(v=vs.113).aspx

要获取字符串,应使用以下内容,请参阅部分 编写 SQL 非实体类型的查询 here

var query = db.Database.SqlQuery<string>("SELECT @@VERSION").FirstOrDefault(); 
ViewBag.SQLDBVersion= query; // viewbag is dynamic

正在观看

@MvcHtmlString.Create(ViewBag.SQLDBVersion)

首先确保您的模型是相同的:我的意思是如果任何字段可以为空,它在您的模型中必须是可以为空的(更新您的模型)。另一个原因,尝试省略 .ToArray(),将结果保存在变量中并检查 ii.Maybe,出于测试原因,尝试使用其他方法获取日期(例如 https://msdn.microsoft.com/en-us/library/fksx3b4f.aspx