【问题标题】:How do I call a stored procedure from a controller, retrieve filtered results and pass it to view?如何从控制器调用存储过程、检索过滤结果并将其传递给查看?
【发布时间】:2016-10-21 08:49:29
【问题描述】:

现在我在 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。

这个程序正确吗?如果没有,应该怎么做?

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

【问题讨论】:

  • 这太宽泛了。您的具体问题是什么?
  • 具体问题:如何在实体框架中执行此过程,如果传递给控制器​​的参数不为空,则检索过滤结果(否则检索所有行),然后分配给此product 模型并通过它的视图?

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


【解决方案1】:

看起来不错,除了 .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 查询,该查询仅在迭代集合时生成然后执行 - 在这种情况下,在 View 开始时遍历 IQueryable 对象,并仅检索过滤结果。

【讨论】:

  • 现在我尝试var products = from p in db.Products.SqlQuery<>("exec usp_FilterProducts @productName = {0}, @productDesc = {1}, @quantity = {2}", productName, productDesc, productQty); 调用它,但语法不正确
  • 这与我说的不相同!你不应该有,请坚持我写的。
  • @b.g "已经有一个存储过程"->那么你应该更改那个 sp,否则它的行为与使用 .NET Contains() 时的行为不同(这是我回答的本质)
  • 我更改了程序,现在如果未设置过滤器字段,页面将不显示任何项目
  • 您是否添加了% 标志?它们是必不可少的,没有它们 LIKE 的行为就像 = 一样(因此只能找到相等的字符串)。
【解决方案2】:

只需调用 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();

【讨论】:

  • 也许需要在 {0} 和 {1} 周围加上引号?
  • Ricardo:要么使用引号,要么使用 SqlParameters,现在你都没有......
  • "查询正文必须以 select 或 group 子句结尾"。我复制并运行了相同的代码
  • 代码是正确的。不需要引号。 SqlParameters 都没有。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
相关资源
最近更新 更多