C#中如何使用EF Core的查询自定义投影?到自定义类?

来源:这里教程网 时间:2026-02-21 17:26:34 作者:

在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 就能高效地返回自定义类型的查询结果。

相关推荐