0

このコードにつまずいたとき、私はこのチュートリアルhttp://www.asp.net/mvc/tutorials/mvc-music-storeに従っていました。

public ActionResult AddToCart(int id)
    {

        // Retrieve the album from the database
        var addedAlbum = storeDB.Albums
            .Single(album => album.AlbumId == id);

        // Add it to the shopping cart
        var cart = ShoppingCart.GetCart(this.HttpContext);

        cart.AddToCart(addedAlbum);

        // Go back to the main store page for more shopping
        return RedirectToAction("Index");
    }

私は2つのことを理解していません:
1) var addedAlbum = storeDB.Albums .Single(album => album.AlbumId == id);

このコードは何をしていますか? 演算子 => が何をするのかわかりません。また、.Single はデータベース用の機能だと思いますか?
2) この関数はそれ自体を呼び出していますか? この方法でアルバムをカートに追加する方法がわかりません。これにより、関数が無限ループに陥ることはありませんか?

4

2 に答える 2

2

まだよく知らないコア C# がたくさんあるようです。

演算子は=>ラムダ演算子であり、インライン関数を簡潔に記述する方法です。

このSingle関数は、この場合はデータベースを呼び出す拡張メソッドです。この方法では、式ツリーと呼ばれる優れた機能を利用して、厳密に型指定された C# の比較を対応する SQL コードに変換します。それがどのように機能するかはかなり高度なトピックなので、今のところ「魔法」と考えてください。

オブジェクトのAddToCartメソッドは、コードが現在含まれcartているコントローラー アクション メソッドとは異なりますAddToCart。これはかなり基本的なオブジェクト指向プログラミングであるため、そのリンクはありません。

cart.AddToCart実際にデータベースが更新されると思います。

理解を深めるためにLINQについても読んでください。これは、Entity Framework を使用した Linq To Sql または LINQ to Entities のいずれかである可能性が最も高いです。

于 2012-04-13T18:18:51.873 に答える
0

アクションには、呼び出しでデータベースから取得できるアルバムの ID が渡されstoreDB.Albums.Single()ます。(ラムダは、「AlbumId 列の値がコントローラーに渡された ID と一致するデータベース内のエントリを見つける」と言っています。).Single次の LINQ ファクシミリと考えてください。

SELECT TOP(1) *
FROM   Albums
WHERE  Albums.AlbumId = <id>

次に、ユーザーのショッピング カートを取得し、取得したアルバム オブジェクトをカートに追加します。

次に、カート内のすべてのエントリを一覧表示できるインデックスにリダイレクトされます。

于 2012-04-13T18:08:51.033 に答える