119

渡して再利用できるようにしたいラムダ式があります。コードは次のとおりです。

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 を使用したいと思っていますが、これの構文が何であるか、またはそれがどのように機能するかはよくわかりません。誰かが私に例を教えてもらえますか?

4

4 に答える 4

136

デリゲートをパラメーターの型として使用し、次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;
        });

または、ラムダを変数に割り当てて渡します

于 2013-01-12T20:28:51.443 に答える
30

私が理解している場合は、次のコードが必要です。(式ラムダをパラメーターで渡す) メソッド

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");

これが役に立つことを願っています

于 2015-04-24T02:34:35.253 に答える
10

ラムダ式には、Action<parameters>(値を返さない場合) またはFunc<parameters,return>(戻り値がある場合) の型があります。あなたの場合、2 つの入力パラメーターがあり、値を返す必要があるため、次を使用する必要があります。

Func<FullTimeJob, Student, FullTimeJob>
于 2013-01-12T20:29:07.960 に答える
5

デリゲート タイプを使用し、それをコマンド パラメーターとして指定する必要があります。Action組み込みのデリゲート タイプの1 つと を使用できますFunc

あなたの場合、デリゲートは2つのパラメーターを取り、結果を返すように見えるので、次を使用できますFunc

List<IJob> GetJobs(Func<FullTimeJob, Student, FullTimeJob> projection)

GetJobsその後、デリゲート インスタンスを渡してメソッドを呼び出すことができます。これは、その署名に一致するメソッド、匿名デリゲート、またはラムダ式である可能性があります。

GetJobsPS メソッド名には PascalCase を使用する必要がありますgetJobs

于 2013-01-12T20:30:45.630 に答える