如何编写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
相关产品推荐
相关产品推荐

