[英]Pass OrderBy lambda function as a parameter
假设我有一个具有两个属性Name
和Age
的模型名称User
。 我想知道接受User
并返回这些属性之一的lambda函数的类型,以便可以在OrderBy
方法中使用lambda函数。
using System;
using System.Linq;
public class User {
public string Name { get; set; }
public int Age { get; set; }
}
public class MainClass {
static void Main() {
var users = new User[] {
new User { Name = "David", Age = 16 },
new User { Name = "Charlie", Age = 29 },
new User { Name = "Alice", Age = 15 },
new User { Name = "Deanna", Age = 27 },
}.AsQueryable();
Write(GetAdultsBy(users, u => u.Name));
Write(GetAdultsBy(users, u => u.Age));
}
private static IQueryable<User> GetAdultsBy(IQueryable<User> users, Func<User, object> order) {
return users
.Where(u => u.Age > 18)
.OrderBy(order); // FAIL in ORDER BY
}
private static void Write(IQueryable<User> query) {
var names = query.Select(u => u.Name);
Console.WriteLine(string.Join(", ", names));
}
}
运行此代码时出现以下错误:
/tmp/997240133/main.cs(26,14):错误CS0266:无法将类型
System.Linq.IOrderedEnumerable<User>' to
隐式转换System.Linq.IOrderedEnumerable<User>' to
System.Linq.IQueryable'。 存在显式转换(您是否缺少演员表?)
但是显式排序可以与Write(users.OrderBy(u => u.Age));
正如人们所期望的那样。
那么Func<User, object> order
参数的类型应该是什么?
您需要将private static IQueryable<User> GetAdultsBy()
定义为通用函数,以匹配如何定义OrderBy <>。 特别:
private static IOrderedQueryable<User> GetAdultsBy<T>(
IQueryable<User> source,
Expression<Func<User, T>> order)
要使用IQueryable
,您需要传递表达式树( Expression<Func<...>>
)。
表达式树在运行时对lambda的内容进行编码,从而可以将其转换为SQL。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.