我想显示生日即将到来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();
}
问题是我上面的代码无法正常工作,并且在调试时没有显示任何错误。
答案 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
但您既不会将query
与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();
}
纠正其中三个并且你有一个安全的方法来获得你想要的东西(注意:谨防闰年):
/*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!