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

如何编写LINQ比较年月并按年月从MongoDB查询数据?

如何用LINQ按年月筛选MongoDB中的记录?

看起来你已经搭好了基础的MongoDB查询框架,我帮你完善按年月筛选的逻辑,同时优化一下异步调用的写法(直接访问Result容易造成线程阻塞,建议用await更规范)。

假设你的HolidayListModel里有一个存储日期的属性(比如HolidayDate,记得替换成你实际的属性名),另外默认你有一个year参数用来指定目标年份(如果没有可以根据需求调整)。

推荐方案:在数据库端完成筛选(性能更优)

这种方式会把筛选条件推送到MongoDB服务器执行,避免把全量数据拉到客户端再过滤,适合数据量较大的场景:

// 注意:方法需要标记为async Task
public async Task<List<HolidayListModel>> GetHolidaysByMonth(int businessid, string month, int year)
{
    Connection cn = new Connection();
    IMongoDatabase db = cn.ConnectionString();
    var collection = db.GetCollection<HolidayListModel>("Holiday");
    
    // 基础筛选条件:匹配business_id
    var baseFilter = Builders<HolidayListModel>.Filter.Eq(x => x.business_id, businessid);
    
    // 构建日期筛选条件
    FilterDefinition<HolidayListModel> dateFilter;
    if (month.Equals("All", StringComparison.OrdinalIgnoreCase))
    {
        // 筛选指定年份的所有记录
        dateFilter = Builders<HolidayListModel>.Filter.Where(x => x.HolidayDate.Year == year);
    }
    else
    {
        // 转换月份为整数,处理无效输入
        if (!int.TryParse(month, out int targetMonth))
        {
            return new List<HolidayListModel>();
        }
        // 筛选指定年份和月份的记录
        dateFilter = Builders<HolidayListModel>.Filter.Where(x => 
            x.HolidayDate.Year == year && x.HolidayDate.Month == targetMonth);
    }
    
    // 组合筛选条件
    var combinedFilter = Builders<HolidayListModel>.Filter.And(baseFilter, dateFilter);
    
    try
    {
        // 异步查询并返回结果
        return await collection.Find(combinedFilter).ToListAsync();
    }
    catch (Exception ex)
    {
        // 添加日志或其他异常处理逻辑
        Console.WriteLine($"查询出错:{ex.Message}");
        return new List<HolidayListModel>();
    }
}

备选方案:在客户端内存中筛选(不推荐大数据量)

如果你因为某些原因必须先拉取所有匹配business_id的记录,再在内存中过滤,可以这样写(同样优化了异步调用):

public async Task<List<HolidayListModel>> GetHolidaysByMonth(int businessid, string month, int year)
{
    Connection cn = new Connection();
    IMongoDatabase db = cn.ConnectionString();
    var collection = db.GetCollection<HolidayListModel>("Holiday");
    
    var filter = Builders<HolidayListModel>.Filter.Eq(x => x.business_id, businessid);
    
    try
    {
        // 用await异步获取结果,避免线程阻塞
        var allHolidays = await collection.Find(filter).ToListAsync();
        
        if (allHolidays == null || !allHolidays.Any())
        {
            return new List<HolidayListModel>();
        }
        
        IEnumerable<HolidayListModel> filteredHolidays;
        if (month.Equals("All", StringComparison.OrdinalIgnoreCase))
        {
            filteredHolidays = allHolidays.Where(x => x.HolidayDate.Year == year);
        }
        else
        {
            if (!int.TryParse(month, out int targetMonth))
            {
                return new List<HolidayListModel>();
            }
            filteredHolidays = allHolidays.Where(x => 
                x.HolidayDate.Year == year && x.HolidayDate.Month == targetMonth);
        }
        
        return filteredHolidays.ToList();
    }
    catch (Exception ex)
    {
        Console.WriteLine($"查询出错:{ex.Message}");
        return new List<HolidayListModel>();
    }
}

关键注意点:

  • 异步调用规范:一定要用await调用ToListAsync(),不要直接访问Result属性,后者会导致线程阻塞,违背异步编程的初衷。
  • 属性映射一致:确保HolidayListModel中的日期属性名和MongoDB中的字段一致,或者通过[BsonElement]特性做字段映射。
  • 异常处理:添加适当的异常捕获逻辑,避免程序崩溃,同时方便排查问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:11:10