4

MicrosoftのMVCチュートリアルNerdDinnersからのこのコードでは:

パブリッククラスDinnerRepository{

private NerdDinnerDataContext db = new NerdDinnerDataContext();

//
// Query Methods

public IQueryable<Dinner> FindAllDinners() {
    return db.Dinners;
}

public IQueryable<Dinner> FindUpcomingDinners() {
    return from dinner in db.Dinners
           where dinner.EventDate > DateTime.Now
           orderby dinner.EventDate
           select dinner;
}

public Dinner GetDinner(int id) {
    return db.Dinners.SingleOrDefault(d => d.DinnerID == id);
}

//
// Insert/Delete Methods

public void Add(Dinner dinner) {
    db.Dinners.InsertOnSubmit(dinner);
}

public void Delete(Dinner dinner) {
    db.RSVPs.DeleteAllOnSubmit(dinner.RSVPs);
    db.Dinners.DeleteOnSubmit(dinner);
}

//
// Persistence 

public void Save() {
    db.SubmitChanges();
} 

}

何をしますか:

public Dinner GetDinner(int id) {
    return db.Dinners.SingleOrDefault(d => d.DinnerID == id);
}

「d」はどういう意味ですか?このコードはどのように機能しますか?私はそれがdinneridが関数パラメーターからのidと一致する夕食を取り戻すことを知っています。「dgoesto...」の意味がわかりません。私はそれがラムダであることを知っていますが、私は実際にはそれを理解していません。「d」は何の意味ですか?それは何をするためのものか?

これはここにラムダなしで書かれている可能性がありますか(どのように)?

4

4 に答える 4

5

おそらく匿名メソッドについて読む必要があります。

基本的に、参照しているコードは、次のようなランバ構文を使用せずに匿名メソッドとして記述できます。

public Dinner GetDinner(int id) {    
   return db.Dinners.SingleOrDefault(delegate (Dinner d) {
                                       return d.DinnerID == id;
                                     });
}
于 2009-05-11T20:38:53.260 に答える
2

ラムダ構文とその使用目的を理解する必要があります。

これはそれを説明するのにまともな仕事をする記事です。

ただし、NerdDinnerコンテキストに関する質問に簡単に答えるために、このコンテキストの「d」は、Dinnerオブジェクトであるlamda式に渡される単なるパラメーターです。

于 2009-05-11T20:25:19.727 に答える
2

これも似ています...

from d in db.Dinners
where d.DinnerID == id
select d

コードは基本的にディナーをループして、最初のディナーを返します。ディナーが見つからない場合はデフォルトを返します。

これは、サンプルで使用されている命名規則が本番環境で常に適切であるとは限らない場合です。ローカル変数として「d」を使用するのが一般的であり、「dinner」の変数名を選択する方がおそらく適切ですが、この場合、dのスコープは非常に小さいため、どちらの方法でも明確です。ラムダ式がどのように機能するか。

于 2009-05-11T20:28:10.690 に答える
0

このコードのビット:

d => d.DinnerID == id

タイプの関数を定義するものと考えることができますFunc<Dinner, bool>

何に渡しても、この関数を呼び出して渡すことができ、がDinner返されboolます。

void Foo(Func<Dinner, bool> f)
{
    bool result = f(new Dinner());
}

実際の例では、関数は指定された関数を複数回呼び出し、毎回SingleOrDefault異なる値を渡し、関数が返すforを返します。DinnerDinnertrue

実際、を使用しているIQueryableので、これは概念的にのみ発生します。関数のコードがSQLに変換され、すべての実行がデータベース内で行われる可能性があります。

于 2009-05-11T20:40:08.343 に答える