如何从控制器调用存储过程,检索过滤结果并将其传递给视图?

时间:2016-10-21 08:49:29

标签: sql-server asp.net-mvc entity-framework stored-procedures

现在我在Entity Framework中这样做来过滤结果:

public ActionResult Index(string productName, string productDesc, string productQty)
{
    var products = from p in db.Products select p;

    if (!String.IsNullOrEmpty(productName))
    {
          products = products.Where(p=>p.ProductName.Contains(productName));
    }

    // similarly for other parameters and returning to view as:
    return View(products);
}

我想编写一个存储过程来过滤数据库本身的产品,然后再将其提取到应用程序中。

存储过程是:

CREATE PROCEDURE [dbo].[usp_FilterProducts]
    @ProductName varchar = null,
    @ProductDesc varchar  = null,
    @Quantity int = null
AS
BEGIN
    SET NOCOUNT ON

    SELECT *
    FROM [Products]
    WHERE (@ProductName IS NULL OR [ProductName] LIKE @ProductName)
      AND (@ProductDesc IS NULL OR [ProductDesc] LIKE @ProductDesc)
      AND (@Quantity IS NULL OR [Quantity] = @Quantity)
END

我有一个相应的模型类Product

这个程序是否正确?如果不是,应该怎么做?

而且,我如何从控制器中调用它?

2 个答案:

答案 0 :(得分:0)

只需调用DbSet的SqlQuery方法:https://msdn.microsoft.com/en-us/library/gg696460(v=vs.113).aspx。 在这种情况下,做这样的事情:

var products = from p in db.Products.SqlQuery("exec usp_FilterProducts @productName = {0}, @productDesc = {1}, @quantity = {2}", productName, productDesc, productQty).ToList();

答案 1 :(得分:0)

看起来很好,除了.NET .Contains()与SQL LIKE不完全相同的事实。
这就是实现同样的目标:

SELECT * FROM [Products]
WHERE ( @ProductName is null or [ProductName] LIKE '%' + @ProductName + '%')
AND   ( @ProductDesc is null or [ProductDesc] LIKE '%' + @ProductDesc + '%')
AND   ...

然后,通过在LINQ中应用一个或多个.Where子句,您实际上构建了一个动态SQL查询,该查询仅在迭代集合时生成然后执行 - 在这种情况下在{{1}内部因为它开始迭代View对象,并仅检索过滤结果。