使用MVC和EF返回参数化查询结果

时间:2015-02-07 18:15:37

标签: c# asp.net asp.net-mvc entity-framework

我正在尝试使用Visual Studio 2013,MVC和Entity Framework来返回存储过程的结果以向用户显示数据。我已经将EDMX模型添加到我的解决方案中,并完成了我想要执行的存储过程的函数导入向导。我坚持的是如何编码模型和控制器并将数据返回到View。我不想使用生成的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>

这只是简单的代码。我的参考文献都很机智。

1 个答案:

答案 0 :(得分:0)

如果您已经在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();