You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

复用含相同属性但Lambda Where条件不同的方法的实现方案

当然可以!封装通用逻辑消除冗余代码的方案

你完全可以把重复的查询和映射逻辑抽离成一个通用方法,只让调用方传入不同的过滤条件即可。这样既减少了代码冗余,也让后续维护更简单。

第一步:重构核心通用方法

我们可以利用LINQ的Expression<Func<Users, bool>>来接收动态的过滤条件,把重复的查询、映射和执行逻辑封装到一个私有核心方法中:

// 核心通用方法,负责处理通用逻辑
private IEnumerable<UserVm> GetUsers(Expression<Func<Users, bool>> filter)
{
    return db.Users
        .Where(filter) // 应用传入的过滤条件
        .Select(users => new UserVm
        {
            Name = users.Name,
            Age = users.Age,
            Location = users.Location
        }) // 统一的模型到视图模型映射
        .ToList(); // 执行查询并返回结果
}

第二步:简化原有查询方法

原来的三个查询方法现在只需要调用这个通用方法,传入对应的过滤条件即可:

public IEnumerable<UserVm> GetUsersByName(string name)
{
    return GetUsers(x => x.Name == name);
}

public IEnumerable<UserVm> GetUsersByAge(int age)
{
    return GetUsers(x => x.Age == age);
}

public IEnumerable<UserVm> GetUsersByLocation(string location)
{
    return GetUsers(x => x.Location == location);
}

为什么用Expression<Func<Users, bool>>而不是普通Func?

如果你的db.Users是EF Core(或类似ORM)的DbSet,使用表达式树(Expression<>)可以让ORM把过滤条件翻译成SQL语句,在数据库层面完成过滤,避免把全表数据加载到内存后再筛选,大幅提升性能。如果是内存中的集合,普通Func也能工作,但表达式树兼容两种场景,通用性更强。

额外优化:用AutoMapper简化映射

如果后续模型字段变多,手动映射会很繁琐,可以用AutoMapper这类库来自动处理模型到视图模型的映射:

首先配置AutoMapper的映射规则(比如在Profile中):

public class UserProfile : Profile
{
    public UserProfile()
    {
        CreateMap<Users, UserVm>(); // 自动匹配同名属性
    }
}

然后修改通用方法:

private readonly IMapper _mapper;

// 通过构造函数注入AutoMapper实例
public YourServiceClass(IMapper mapper)
{
    _mapper = mapper;
}

private IEnumerable<UserVm> GetUsers(Expression<Func<Users, bool>> filter)
{
    return db.Users
        .Where(filter)
        .ProjectTo<UserVm>(_mapper.ConfigurationProvider) // AutoMapper自动映射
        .ToList();
}

这样连手动创建UserVm的代码都可以省掉,代码更简洁易维护。

内容的提问来源于stack exchange,提问作者jsonGPPD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:30:27