繁体   English   中英

日期之间的 Linq 复杂查询搜索

[英]Linq Complex Query Search between Dates

我有这个模型,其中包含列表月份 1 月 - 12 月。我希望用户将日志示例的开始日期设置为 12 月 26 日至 1 月 25 日或 1 月 1 日 - 1 月 31 日

 public class SalaryMonth
    {
        public int Id { get; set; }

        public int StartMonth { get; set; }
        public int StartDay { get; set; }

        public int EndMonth { get; set; }
        public int EndDay { get; set; }

        public string Name { get; set; }

    }

我如何根据提供的日期获取 SalaryMonth 并且是一个月,这是我的业务逻辑,它总是返回 null

namespace Contracts.Attendances
{


    public interface IAttendanceService
    {       
        Task<SalaryMonth> GetASalaryMonthByDate(DateTime date);

    }

     public class AttendanceService : IAttendanceService
    {

        /.../

        public async Task<SalaryMonth> GetASalaryMonthByDate(DateTime date) {
        var day = date.Day;
            var month = date.Month;
            var result = await _context.SalaryMonths.
                .FirstOrDefaultAsync(p => (p.StartMonth == month && p.StartDay >= day && p.StartDay <= day) 
                                          || ( p.EndMonth == month && p.EndDay >= day && p.EndDay <= day));

            return result;
        }

    }
}

来自数据库的 Json

{
    "SalaryMonth": [
        {
            "Id": "3",
            "StartMonth": "2",
            "StartDay": "26",
            "EndMonth": "3",
            "EndDay": "25",
            "Name": "March"
        },
        {
            "Id": "4",
            "StartMonth": "3",
            "StartDay": "26",
            "EndMonth": "4",
            "EndDay": "25",
            "Name": "April"
        },
        {
            "Id": "5",
            "StartMonth": "4",
            "StartDay": "26",
            "EndMonth": "5",
            "EndDay": "25",
            "Name": "May"
        },
        {
            "Id": "6",
            "StartMonth": "5",
            "StartDay": "26",
            "EndMonth": "6",
            "EndDay": "25",
            "Name": "June"
        },
        {
            "Id": "7",
            "StartMonth": "6",
            "StartDay": "26",
            "EndMonth": "7",
            "EndDay": "25",
            "Name": "July"
        },
        {
            "Id": "8",
            "StartMonth": "7",
            "StartDay": "26",
            "EndMonth": "8",
            "EndDay": "25",
            "Name": "August"
        },
        {
            "Id": "9",
            "StartMonth": "8",
            "StartDay": "26",
            "EndMonth": "9",
            "EndDay": "25",
            "Name": "September"
        },
        {
            "Id": "10",
            "StartMonth": "9",
            "StartDay": "26",
            "EndMonth": "10",
            "EndDay": "25",
            "Name": "October"
        },
        {
            "Id": "11",
            "StartMonth": "10",
            "StartDay": "26",
            "EndMonth": "11",
            "EndDay": "25",
            "Name": "November"
        },
        {
            "Id": "12",
            "StartMonth": "11",
            "StartDay": "26",
            "EndMonth": "12",
            "EndDay": "25",
            "Name": "December"
        },
        {
            "Id": "2",
            "StartMonth": "2",
            "StartDay": "26",
            "EndMonth": "2",
            "EndDay": "25",
            "Name": "February"
        },
        {
            "Id": "1",
            "StartMonth": "12",
            "StartDay": "26",
            "EndMonth": "1",
            "EndDay": "25",
            "Name": "January"
        }
    ]
}

如何查询记录以允许用户从提供的日期获取工资月份。 示例用户提供 26/12/2019 到 26/01/2020 之间的任何日期,结果必须是一月,因为该日期是一月,因为 Jan StartMonth 是 12,StartDate 26 和 EndMonth 是 1 和 EndDate 25

所以我想我知道你想做什么。 如果我理解正确,那么你的逻辑在你的 linq 调用中有点混乱。 给定任何一天,该天不能小于或等于某个日期,也不能大于或等于该同一日期,除非它是同一日期。

所以你需要这样做:

C# 代码:

.FirstOrDefaultAsync(p => (p.StartMonth == month && p.StartDay <= day) || ( p.EndMonth == month && p.EndDay >= day ));

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM