我有一个lambda表达式,我希望能够传递并重用。这是代码:
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>();
}
这里的关键是,我希望能够将我在这里使用的lambda表达式传递给调用此代码的方法,因此我可以重用它。 lambda表达式是我的.Query方法中的第二个参数。我假设我想要使用Action或Func,但我不太确定它的语法是什么或它是如何工作的。有人可以举个例子吗?
答案 0 :(得分:110)
使用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;
});
或者将lambda分配给变量并传递 it 。
答案 1 :(得分:22)
如果我了解您需要以下代码。 (通过参数传递表达式lambda) 方法
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");
我希望这很有用
答案 2 :(得分:7)
Lambda表达式的类型为Action<parameters>
(如果它们不返回值)或Func<parameters,return>
(如果它们具有返回值)。在您的情况下,您有两个输入参数,并且您需要返回一个值,因此您应该使用:
Func<FullTimeJob, Student, FullTimeJob>
答案 3 :(得分:4)
您应该使用委托类型并将其指定为命令参数。您可以使用其中一种内置委托类型 - Action
和Func
。
在您的情况下,您的委托看起来像两个参数,并返回结果,因此您可以使用Func
:
List<IJob> GetJobs(Func<FullTimeJob, Student, FullTimeJob> projection)
然后,您可以调用传递委托实例的GetJobs
方法。这可以是匹配该签名,匿名委托或lambda表达式的方法。
P.S。您应该使用PascalCase作为方法名称 - GetJobs
,而不是getJobs
。