2011-06-08 13 views
5

私はコードサンプルを作成しています。彼らはプレーンな古いADO.NETを使用します。それらには、1レコードを戻すReadという汎用関数があります。ここでは、コードは次のようになります。1レコードを返すための一般的な検索方法の作成

public static T Read<T>(string storedProcedure, Func<IDataReader, T> make, object[] parms = null) 
{ 
    using (SqlConnection connection = new SqlConnection()) 
    { 
     connection.ConnectionString = connectionString; 

     using (SqlCommand command = new SqlCommand()) 
     { 
     command.Connection = connection; 
     command.CommandType = CommandType.StoredProcedure; 
     command.CommandText = storedProcedure; 
     command.SetParameters(parms); 

     connection.Open(); 

     T t = default(T); 
     var reader = command.ExecuteReader(); 
     if (reader.Read()) 
      t = make(reader); 

     return t; 
     } 
    } 
} 

なぜ私にはわからない:彼らはメソッドのシグネチャの一部としてFunc<IDataReader, T> make使用

  • ?このようにするのは効率的ですか?これを行うにはよりよい方法/ベストプラクティスがありますか?
  • 私は理解していませんT t = default(T);?このようにするのは効率的ですか?これを行うにはよりよい方法/ベストプラクティスがありますか?
  • t = make(reader);は何をしますか?このようにするのは効率的ですか?これを行うにはよりよい方法/ベストプラクティスがありますか?

呼び出し元の関数は次のようなものになります。

public Customer GetCustomer(int customerId) 
{ 
    // Other code here 
    string storedProcedure = "MyStoredProcedure"; 
    object[] parameters = { "@CustomerId", customerId }; 
    return Db.Read(storedProcedure, Make, parameters); 
} 

private static Func<IDataReader, Customer> Make = reader => 
new Customer 
{ 
    CustomerId = reader["CustomerId"].AsId(), 
    Company = reader["CompanyName"].AsString(), 
    City = reader["City"].AsString 
}; 

を私はFunc Make部分を理解していませんか?誰かがここで何が起こっているのか、これが良い習慣なら私に説明してもらえますか?変更があれば幸いですが、詳細なサンプルコードを提供してください:)

答えて

3

make(マテリアライゼーション)のデリゲートは多目的で柔軟性がありますが、大部分のケースではIMOによって少しでも不必要な作業が行われます。 の意味で - デリゲートをコールバックとして使用して、呼び出し元にレコードの読み取り方法を指定させます。

注意、彼らは消費者変化にレコードを期待していないことから、彼らはおそらくIDataReaderIDataRecordはないさらすべきである(いずれかの読者はまた、レコードを実装)。

TDSストリームにエラーメッセージがある場合、最初のレコードの後に、表示された方法では表示されませんが、それは端的なケースです。あなたはそれを軽減したい場合は、TDSストリームの最後まで読むことができる:個人的に

while(reader.NextResult()) {} 

、しかし、私はここにDapperのドットネット使用したい - そのあたりの型を記述する必要がなくなり手動でコード:

var cust = connection.Query<Customer>("MyStoredProcedure", 
    new { CustomerId = customerId }, 
    commandType: CommandType.StoredProcedure).Single(); 

このSPROCとしてMyStoredProcedureを実行し、customerIdからの値と@CustomerIdを渡し、その後Customerレコードを作成するために、直接カラム< ===>プロパティ/フィールドの一致を適用し、そこであると主張正確に1つの結果を返します。

2

これらはメソッドシグネチャの一部としてFunc makeを使用していますか?このようにするのは効率的ですか?これを行うにはよりよい方法/ベストプラクティスがありますか?彼らが戻ってT性質を読者にマッピングする方法がわからないようにする方法Tの一般的な性質に起因

は不明です。だから彼らはこの責任をメソッドの呼び出し側に任せます。実際にはこれは十分に効率的であり、それは良い習慣です。

私はT t = default(T);を理解していません。このようにするのは効率的ですか?これを行うにはよりよい方法/ベストプラクティスがありますか?

Tは、値型または参照型のいずれでもかまいません。nullに割り当てることはできません。 default(T)はこの型のデフォルト値を返します。参照型の場合はnullになります。値の型(整数など)の場合、0になります。

t = make(リーダー)とは何ですか?行う?このようにするのは効率的ですか?これを行うにはよりよい方法/ベストプラクティスがありますか?

渡されたデリゲートを呼び出し、結果をtに割り当てます。

関連する問題