Return 使用 MVC 和 EF 的参数化查询结果
Return Parameterized Query Results with MVC and EF
我正在尝试使用 Visual Studio 2013、MVC 和 Entity Framework 到 return 存储过程的结果来向用户显示数据。我已经将 EDMX 模型添加到我的解决方案中,并为我要执行的存储过程完成了函数导入向导。我坚持的是如何编码模型和控制器以及 return 数据到视图。我不想使用生成的 CRUD 操作和 EF 创建的脚手架视图。
存储过程:
SELECT C.ClassName, G.Grade
FROM Classes as C
INNER JOIN Grade as G on C.ClassID = G.ClassID
WHERE C.UserID = @UserID
型号:
public class TestModel
{
public string ClassName {get; set;}
public string Grade{get;set;}
}
控制器:
public class TestController : Controller{
public ActionResult Index()
{
TestEntities db = new TestEntities();
var result = db.TestEntities ("@username");
ViewBag.Results = result.ToList();
return View(result.ToList());
}
}
查看:
<table>
<h>ViewBag.Results.ClassName</h>
<h>ViewBag.Results.Grade</h>
</table>
这只是简单的代码。我的参考资料都完好无损。
如果您已经在 EDMX 中映射了存储过程,则您的上下文中必须有这样的方法:
[DbFunction("TestEntities", "YourStoreProcedureName")]
public virtual IQueryable<TestModel> YourStoreProcedureName(int UserID)
{
var userIDParameter = UserID != 0?
new ObjectParameter("UserID", UserId) :
new ObjectParameter("UserID", typeof(int));
return ((IObjectContextAdapter)this).ObjectContext.CreateQuery<TestModel>("[TestEntities].[YourStoreProcedureName](@UserId)", userIDParameter);
}
因此,您可以通过这种方式从上下文中调用它:
TestEntities db = new TestEntities();
var result = db.YourStoreProcedureName(1).ToList();
检查此 page 以查看有关此的更多详细信息。
现在,如果您想使用 EF 调用参数化查询,您可以按照我下面的说明进行操作:
var query =String.Format( @"SELECT C.ClassName, G.Grade
FROM Classes as C
INNER JOIN Grade as G on C.ClassID = G.ClassID
WHERE C.UserID = {0}",UserId);
TestEntities db = new TestEntities();
var result = db.Database.SqlQuery<TestModel>(query).ToList();
而且,如果你想调用一个没有在你的 EDMX 中映射的存储过程,你可以这样调用:
TestEntities db = new TestEntities();
var result = db.Database.SqlQuery<TestModel>("YourStoreProcedureName", new SqlParameter("UserId",1)).ToList();
我正在尝试使用 Visual Studio 2013、MVC 和 Entity Framework 到 return 存储过程的结果来向用户显示数据。我已经将 EDMX 模型添加到我的解决方案中,并为我要执行的存储过程完成了函数导入向导。我坚持的是如何编码模型和控制器以及 return 数据到视图。我不想使用生成的 CRUD 操作和 EF 创建的脚手架视图。
存储过程:
SELECT C.ClassName, G.Grade
FROM Classes as C
INNER JOIN Grade as G on C.ClassID = G.ClassID
WHERE C.UserID = @UserID
型号:
public class TestModel
{
public string ClassName {get; set;}
public string Grade{get;set;}
}
控制器:
public class TestController : Controller{
public ActionResult Index()
{
TestEntities db = new TestEntities();
var result = db.TestEntities ("@username");
ViewBag.Results = result.ToList();
return View(result.ToList());
}
}
查看:
<table>
<h>ViewBag.Results.ClassName</h>
<h>ViewBag.Results.Grade</h>
</table>
这只是简单的代码。我的参考资料都完好无损。
如果您已经在 EDMX 中映射了存储过程,则您的上下文中必须有这样的方法:
[DbFunction("TestEntities", "YourStoreProcedureName")]
public virtual IQueryable<TestModel> YourStoreProcedureName(int UserID)
{
var userIDParameter = UserID != 0?
new ObjectParameter("UserID", UserId) :
new ObjectParameter("UserID", typeof(int));
return ((IObjectContextAdapter)this).ObjectContext.CreateQuery<TestModel>("[TestEntities].[YourStoreProcedureName](@UserId)", userIDParameter);
}
因此,您可以通过这种方式从上下文中调用它:
TestEntities db = new TestEntities();
var result = db.YourStoreProcedureName(1).ToList();
检查此 page 以查看有关此的更多详细信息。
现在,如果您想使用 EF 调用参数化查询,您可以按照我下面的说明进行操作:
var query =String.Format( @"SELECT C.ClassName, G.Grade
FROM Classes as C
INNER JOIN Grade as G on C.ClassID = G.ClassID
WHERE C.UserID = {0}",UserId);
TestEntities db = new TestEntities();
var result = db.Database.SqlQuery<TestModel>(query).ToList();
而且,如果你想调用一个没有在你的 EDMX 中映射的存储过程,你可以这样调用:
TestEntities db = new TestEntities();
var result = db.Database.SqlQuery<TestModel>("YourStoreProcedureName", new SqlParameter("UserId",1)).ToList();