0

は今、私は結果をフィルタリングするエンティティフレームワークでこれをやっている:コントローラからストアドプロシージャを呼び出し、フィルタリングされた結果を取得して表示するにはどうすればよいですか?

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 

IがProductとして対応するモデルクラスを有しています。

この手順は正しいですか?そうでない場合、どうすればよいでしょうか?

そして、コントローラからどのように呼び出すのですか?

+0

これは広すぎます。あなたの*具体的な質問は何ですか? –

+0

特定の質問:Entity Frameworkでこのプロシージャを実行するにはどうしたら、コントローラに渡されたパラメータがnullでない場合にフィルタリングされた結果を取得し、(すべての行を取得して)この 'product'モデルに割り当てて、ビューに渡しますか? –

答えて

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(); 
+0

これには構文エラーがあります。 –

+0

エラーはありますか? –

+1

おそらく{0}と{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内の1つまたは複数の.Where条項を適用することで、あなたは基本的にのみ生成される動的SQLクエリを作成して、ときに実行されますコレクションは反復されます - この場合はの内部で、IQueryableオブジェクトを反復処理し、フィルタリングされた結果のみを取得します。

+0

ストアドプロシージャは既にデータベース –

+0

で作成されていますが、db.Products.SqlQuery <>( "exec usp_FilterProducts @productName = {0}、@productDesc = {1}、@quantity = { 2} "、productName、productDesc、productQty);'それを呼び出すには構文は互換性がありません –

+0

これは私が言ったのと同じ*ではありません。 <>をつけてはいけません。私が書いたものに固執してください。 –

関連する問題