Saya memiliki ekspresi lambda yang ingin saya bagikan dan gunakan kembali. Berikut kodenya:
public List<IJob> getJobs(/* i want to pass the lambda expr in here */) {
using (SqlConnection connection = new SqlConnection(getConnectionString())) {
connection.Open();
return connection.Query<FullTimeJob, Student, FullTimeJob>(sql,
(job, student) => {
job.Student = student;
job.StudentId = student.Id;
return job;
},
splitOn: "user_id",
param: parameters).ToList<IJob>();
}
Kuncinya di sini, adalah saya ingin meneruskan ekspresi lambda yang saya gunakan di sini ke dalam metode yang memanggil kode ini, jadi saya bisa menggunakannya kembali. Ekspresi lambda adalah argumen kedua di dalam metode .Query saya. Saya berasumsi saya ingin menggunakan Action atau Func, tapi saya tidak begitu yakin apa sintaksnya atau bagaimana cara kerjanya. Bisakah seseorang memberi saya contoh?
Jawaban:
Gunakan
Func<T1, T2, TResult>
delegasi sebagai tipe parameter dan teruskan keQuery
:Anda akan menyebutnya:
Atau menetapkan lambda untuk variabel dan lulus itu di.
sumber
Jika saya mengerti, Anda memerlukan kode berikut. (melewatkan ekspresi lambda dengan parameter) Metode
Metode pemanggilan
Anda dapat melakukan hal yang sama di kelas mereka, lihat ini contohnya.
Metode pemanggilan
Semoga bermanfaat
sumber
Compile()
di.Where
? Saya telah melihat itu berhasil tanpa itu juga.Ekspresi lambda memiliki tipe
Action<parameters>
(jika mereka tidak mengembalikan nilai) atauFunc<parameters,return>
(jika mereka memiliki nilai yang dikembalikan). Dalam kasus Anda, Anda memiliki dua parameter input, dan Anda perlu mengembalikan nilai, jadi Anda harus menggunakan:sumber
Anda harus menggunakan tipe delegasi dan menetapkannya sebagai parameter perintah Anda. Anda dapat menggunakan salah satu tipe delegasi bawaan -
Action
danFunc
.Dalam kasus Anda, sepertinya delegasi Anda mengambil dua parameter, dan mengembalikan hasil, sehingga Anda dapat menggunakan
Func
:Anda kemudian dapat memanggil
GetJobs
metode Anda dengan mengirimkan instance delegasi. Ini bisa menjadi metode yang cocok dengan tanda tangan itu, delegasi anonim, atau ekspresi lambda.PS Anda harus menggunakan PascalCase untuk nama metode -
GetJobs
, bukangetJobs
.sumber