【问题标题】:Fetch data by upcoming birthdays in linq to sql在 linq to sql 中按即将到来的生日获取数据
【发布时间】:2016-02-18 00:32:18
【问题描述】:

我想显示未来 15 天内生日的人的列表。我的表格列中有以下日期:

让我更清楚我的问题

下面是我的员工表列

EMP_ID |EMP_TYPE |EMP_USERNAME |EMP_DOB ======= |========== |===============|=============== === 1 |管理员 |埃琳娜·吉尔伯特 |1993-02-19 2 |员工 |凯瑟琳·皮尔斯 |1993-03-19 3 |员工 |STEFAN SALVATORE |1993-04-19 4 |员工 |达蒙·萨尔瓦托 |1993-05-19 5 |员工 |杰里米·吉尔伯特 |1993-05-20

现在我只想显示 15 天内即将到来的生日。 下面我创建了一个自定义类,在其中设置了两个属性:

public class Birthday
{
   public string Name { get; set; }
   public DateTime date { get; set; }
}

下面是我的 web 方法,它返回一个列表,我只需要 Emp_Username 和 Emp_DOB 列表,这些列表将在 15 天内推出。

[WebMethod]
public static List<Birthday> getBirthday()
{
   var slist = new List<Birthday>();
   var db = new BLUEPUMPKINEntities();
   var query = (from emp in db.Employees
   let BirthdayDiff = (new DateTime(DateTime.Now.Year,
                      emp.EMP_DOB.Value.Month, emp.EMP_DOB.Value.Day) -                                                                                                         DateTime.Now).TotalDays where BirthdayDiff >= 0 && BirthdayDiff <= 15
                      select new Birthday { Name = emp.EMP_USERNAME, date = Convert.ToDateTime(emp.EMP_DOB) });
                      return slist.ToList();
    }

问题是我上面的代码不工作并且在调试时没有显示任何错误。

【问题讨论】:

    标签: c# sql asp.net linq linq-to-sql


    【解决方案1】:

    你应该把你的查询改成这样,然后返回:

    [WebMethod]
    public static List<Employee> getBirthday()
    {
        var db = new BLUEPUMPKINEntities();
        const int dateOffset = 15;
    
        var today = DateTime.Today;
        var maxDate = DateTime.Today.AddDays(dateOffset);
    
        return (from emp in db.Employees
                where emp.EMP_DOB.Value >= today
                where emp.EMP_DOB.Value <= maxDate
                select emp).ToList();
    }
    

    【讨论】:

    • 我不知道为什么人们对你的答案和我的帖子投了反对票。检查我的答案。
    【解决方案2】:

    您的代码中至少存在 三个 问题。


    首先,这一行可能会产生不正确的结果:

    let BirthdayDiff = (new DateTime(DateTime.Now.Year, emp.EMP_DOB.Value.Month, emp.EMP_DOB.Value.Day) - DateTime.Now).TotalDays
    

    请注意,您使用当前时间来生成年份

    DateTime.Now.Year
    

    并考虑以下情况:

    现在是25-Dec-15,您的一位Employee 正在过生日 3-Jan-16。根据计算,你会产生DateTime 你的Employee 的值为3-Jan-15,你减去它 DateTime.Now,因此您将获得总天数


    其次,在单个查询中不要使用DateTime.Now超过一次,因为后续DateTime.Now的结果可能与第一个不同。只使用一次:

    DateTime now = DateTime.Now; //and then just use now
    

    或者更好的是,消除所有小时和分钟的差异:

    DateTime today = DateTime.Today;
    

    最后,您永远不会返回查询结果,而只会返回一个空列表。

    注意你定义:

    var slist = new List<Employee>();
    

    还有查询:

    var db = new BLUEPUMPKINEntities();
    var query = from emp in db.Employees
                let BirthdayDiff = (new DateTime(DateTime.Now.Year, emp.EMP_DOB.Value.Month, emp.EMP_DOB.Value.Day) - DateTime.Now).TotalDays
                where BirthdayDiff >= 0 && BirthdayDiff <= 15
                select emp;
    

    但是您既不会将slistquery 关联,也不会返回query 本身。因此,您总是一无所获,因为slist 始终是空的,new List


    小修改:db更改为db.Employees并添加ToList()

    纠正其中三个,你就可以安全地得到你想要的东西(注意:当心闰年)

    [WebMethod]
    public static List<Employee> getBirthday()
    {
        var slist = new List<Employee>();
        var db = new BLUEPUMPKINEntities();
        var today = DateTime.Today; //2.
        return (from emp in db.Employees
                let BirthdayDiff = (new DateTime(today.Year, emp.EMP_DOB.Value.Month, emp.EMP_DOB.Value.Day) - today).TotalDays
                let TrueBirthdayDiff = BirthdayDiff >= 0 ? BirthdayDiff : BirthdayDiff + 365 + Convert.ToInt32(DateTime.IsLeapYear(now.Year)) //1, 3 and leap year
                where TrueBirthdayDiff >= 0 && TrueBirthdayDiff <= 15
                select emp).ToList();
    }
    

    【讨论】:

    【解决方案3】:

    通过使用以下查询,我找到了一种了解即将到来的生日的方法。我不知道为什么人们对我的这篇文章投了反对票。

    var day = DateTime.Now.Day;
    var month = DateTime.Now.Month;
                var query = (from emp in db.Employees
                         where emp.EMP_DOB.HasValue == true
                         && emp.EMP_DOB.Value.Day >= day && emp.EMP_DOB.Value.Month == month
                         select new Birthday
                         {
                             Name = emp.EMP_USERNAME,
                             date = emp.EMP_DOB.Value
                         }).ToList();
    
            return query;
    

    【讨论】:

    • 不,这似乎不正确。 :( emp.EMP_DOB.Value.Day >= day && emp.EMP_DOB.Value.Month == month 这只能比较当前月份,无法获取下个月生日但月份日期小于当前日期的员工。我建议你多给生日样本看看你的算法好不好用,慢慢来,一个一个...
    • 我只想显示当月 15 天内即将到来的生日,所以如果我编码:emp.EMP_DOB.Value.Day
    【解决方案4】:

    您正在返回一个空列表...

    [WebMethod]
    public static IList<Employee> getBirthday()  //<-- changed signature to IList
    {
        var slist = new List<Employee>();
        var db = new BLUEPUMPKINEntities();
        var query = from emp in db.Employees
                    let BirthdayDiff = (new DateTime(DateTime.Now.Year,     
                    emp.EMP_DOB.Value.Month, emp.EMP_DOB.Value.Day) - DateTime.Now).TotalDays
                    where BirthdayDiff >= 0 && BirthdayDiff <= 15
                    select emp;
        //return slist;  //<-- problem right here!
        return query.ToList();  //<-- this should fix it...!
    }
    

    如果您的心和灵魂真的与List&lt;T&gt; 联系在一起,那么请在return slist 之前执行此操作:

    slist.AddRange(query);
    

    HTH!

    【讨论】:

    • 显示Only parameterless constructors and initializers are supported in LINQ to Entities.的错误
    • 您尝试过slist.AddRange() 方法吗?
    • 请检查我更新的问题,我认为它比上一个更清楚
    • 您在尝试编译时是否收到此错误?如果是这样,您是否更改了当前问题中未提及的其他内容?另外,错误与哪一行代码相关?就目前而言,您描述的错误信息不足。
    • 错误显示在同一行查询。为什么你对我的帖子投了反对票。
    猜你喜欢
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 2013-02-13
    • 1970-01-01
    • 2018-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多