答案:在C#中使用EF Core可通过Select方法将查询结果投影到自定义类。1. 创建无映射要求的类如ProductSummary;2. 用Select映射字段,生成高效SQL;3. 支持计算字段与条件逻辑;4. 注意需公共无参构造函数、属性名类型匹配、避免本地方法调用;5. 临时场景可用匿名类。

在C#中使用EF Core进行查询时,如果想将结果投影到一个自定义类(而不是实体类),可以使用 LINQ 的 Select 方法或 自动映射 功能。这种方式称为“自定义投影”。只要字段类型兼容且命名匹配,EF Core 能在查询执行时自动创建自定义类的实例。
1. 创建自定义类
这个类不需要是 EF 的实体,也不需要配置映射。public class ProductSummary
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
public string CategoryName { get; set; }
}
2. 使用 Select 进行投影查询
假设你有一个 Product 实体和关联的 Category 实体:var result = context.Products
.Where(p => p.Price > 100)
.Select(p => new ProductSummary
{
Id = p.Id,
Name = p.Name,
Price = p.Price,
CategoryName = p.Category.Name
})
.ToList();
这会生成 SQL 查询,只选择必要的字段,并将结果映射到 ProductSummary 类型。3. 支持复杂表达式和计算字段
你还可以包含计算值或条件逻辑:var result = context.Products
.Select(p => new ProductSummary
{
Id = p.Id,
Name = p.Name.ToUpper(),
Price = p.Price * 1.1m, // 加税后价格
CategoryName = p.Category != null ? p.Category.Name : "未分类"
})
.ToList();
4. 注意事项
- 自定义类必须有公共无参构造函数(默认就有)
- 属性名和类型需与查询中赋值的字段兼容
- 不能用于跟踪(AsNoTracking 默认生效)
- 避免在 Select 中使用本地方法(如自定义 C# 函数),否则会引发客户端求值或异常
5. 使用匿名类(临时场景)
如果只是局部使用,也可以用匿名对象:var result = context.Products
.Select(p => new
{
p.Id,
p.Name,
p.Price,
CategoryName = p.Category.Name
})
.ToList();
基本上就这些。只要保证投影结构清晰、字段可映射,EF Core 就能高效地返回自定义类型的查询结果。










