表达式树动态构建select匿名查询
时间: 2023-07-31 20:03:56 浏览: 85
在 C# 中,可以使用表达式树动态构建 Select 匿名查询。下面是一个简单的示例:
假设有一个名为 Person 的类,有两个属性:Name 和 Age。
```csharp
class Person {
public string Name { get; set; }
public int Age { get; set; }
}
```
现在我们想要查询出所有人的名字和年龄,但是只想返回一个包含这两个属性的匿名对象。可以使用表达式树来实现这个功能:
```csharp
// 构建表达式树
var parameter = Expression.Parameter(typeof(Person), "p");
var selector = Expression.Lambda(
Expression.New(
typeof { Name = "", Age = 0 }.GetTypeInfo().DeclaredConstructors.First(),
Expression.Property(parameter, "Name"),
Expression.Property(parameter, "Age")),
parameter);
// 执行查询
var people = new List<Person> { new Person { Name = "Alice", Age = 20 }, new Person { Name = "Bob", Age = 30 } };
var result = people.AsQueryable().Select(selector).ToList();
```
在上面的示例中,首先使用 Expression.Parameter 方法创建一个参数表达式,然后使用 Expression.Lambda 方法创建一个 Lambda 表达式,这个 Lambda 表达式表示一个转换函数,将 Person 对象转换为匿名对象。其中,Expression.New 方法表示创建一个新的匿名对象,使用 typeof 获取匿名对象的类型信息,DeclaredConstructors.First() 获取匿名对象的构造函数信息,然后使用 Expression.Property 方法获取 Person 对象的 Name 和 Age 属性值。
最后,使用 AsQueryable 方法将 List 转换成 IQueryable,然后使用 Select 方法对每个 Person 对象执行转换函数,返回一个包含所有匿名对象的列表。
阅读全文