现在我在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
。
这个程序是否正确?如果不是,应该怎么做?
而且,我如何从控制器中调用它?
答案 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
对象,并仅检索过滤结果。