通过linq到sql的即将到来的生日获取数据

时间:2016-02-18 00:32:19

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

我想显示生日即将到来15天的人员名单。我的表格栏中有以下日期:

让我更清楚我的问题

以下是我的员工表栏目

EMP_ID  |EMP_TYPE   |EMP_USERNAME       |EMP_DOB
======= |========== |===============    |==================
1       |ADMIN      |ELENA GILBERT      |1993-02-19
2       |EMPLOYEE   |KATHERINE PIERCE   |1993-03-19
3       |EMPLOYEE   |STEFAN SALVATORE   |1993-04-19
4       |EMPLOYEE   |DAMON SALVATORE    |1993-05-19
5       |EMPLOYEE   |JEREMY GILBERT     |1993-05-20

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

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

下面是我的网络方法,它返回一个列表,我只需要在15天内即可获得Emp_Username和Emp_DOB。

[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();
    }

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

4 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:1)

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

首先,这一行可能会产生错误的结果:

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   您3-Jan-15的值为Employee,而您减去DateTime.Now   DateTime.Now因此你会得到价值&lt;总共-300天。

其次,在单个查询中不要使用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;

查询:

slist

但您既不会将queryquery联系起来,也不会返回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(); }

纠正其中三个并且你有一个安全的方法来获得你想要的东西(注意:谨防闰年)

/*return type*/ operator()(/*params*/)

答案 2 :(得分:1)

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

assets/static

答案 3 :(得分:0)

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

[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<T>密切相关,那么请在return slist之前执行此操作:

slist.AddRange(query);

HTH!