私はラムダ式を持っているので、それをやり取りして再利用したいと思います。コードは次のとおりです。
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>();
}
ここで重要なのは、ここで使用しているラムダ式を、このコードを呼び出しているメソッドに渡して、再利用できるようにすることです。ラムダ式は、.Queryメソッド内の2番目の引数です。私はActionまたはFuncを使用したいと思っていますが、これの構文が何であるか、またはそれがどのように機能するかはよくわかりません。誰かが例を教えてもらえますか?
Func<T1, T2, TResult>
デリゲートをパラメータータイプとして使用し、Query
に渡します。
public List<IJob> getJobs(Func<FullTimeJob, Student, FullTimeJob> lambda)
{
using (SqlConnection connection = new SqlConnection(getConnectionString())) {
connection.Open();
return connection.Query<FullTimeJob, Student, FullTimeJob>(sql,
lambda,
splitOn: "user_id",
param: parameters).ToList<IJob>();
}
}
あなたはそれを呼ぶでしょう:
getJobs((job, student) => {
job.Student = student;
job.StudentId = student.Id;
return job;
});
または、ラムダを変数に割り当ててitを渡します。
私が理解した場合、次のコードが必要です。 (式ラムダをパラメーターで渡す)メソッド
public static void Method(Expression<Func<int, bool>> predicate) {
int[] number={1,2,3,4,5,6,7,8,9,10};
var newList = from x in number
.Where(predicate.Compile()) //here compile your clausuly
select x;
newList.ToList();//return a new list
}
呼び出し方法
Method(v => v.Equals(1));
クラスでも同じことができます。例を参照してください。
public string Name {get;set;}
public static List<Class> GetList(Expression<Func<Class, bool>> predicate)
{
List<Class> c = new List<Class>();
c.Add(new Class("name1"));
c.Add(new Class("name2"));
var f = from g in c.
Where (predicate.Compile())
select g;
f.ToList();
return f;
}
呼び出し方法
Class.GetList(c=>c.Name=="yourname");
これが役に立つことを願っています
Lambda式のタイプは、Action<parameters>
(値を返さない場合)またはFunc<parameters,return>
(返り値がある場合)です。あなたの場合、2つの入力パラメータがあり、値を返す必要があるため、次を使用する必要があります。
Func<FullTimeJob, Student, FullTimeJob>
デリゲートタイプを使用し、それをコマンドパラメーターとして指定する必要があります。組み込みのデリゲート型の1つ、Action
およびFunc
を使用できます。
あなたの場合、デリゲートは2つのパラメータを取り、結果を返すように見えるので、Func
を使用できます。
List<IJob> GetJobs(Func<FullTimeJob, Student, FullTimeJob> projection)
その後、デリゲートインスタンスを渡すGetJobs
メソッドを呼び出すことができます。これは、その署名、匿名デリゲート、またはラムダ式に一致するメソッドです。
追伸メソッド名にはPascalCaseを使用する必要があります-GetJobs
ではなく、getJobs
。