Linq按日期在C#中的日期时间排序
我有一个Web应用程序,它显示当前月份在GridView中的员工生日。Linq按日期在C#中的日期时间排序
生日存储在SQL Server 2008数据库中,它们存储为完整的日期时间,即YYYY-MM-DD HH:MM:SS.000。
查询在视图中完成。我想在本月 例中的日期对它们进行排序:
John Smith Mar 1
Sally Smith Mar 5
Benny Smith Mar 16
的问题是,LINQ声明由他们出生年份对其进行排序,然后按日期。所以,如果萨利出生于1962年,约翰和尼出生于1988年,然后在GridView显示为这样:
Sally Smith Mat 5
John Smith Mar 1
Benny Smith Mar 16
周围挖后,我试图做这种方式它放在这里的另一个问题说会工作。
List<BirthdayCurrentMonthView> record =
(from tab in db.BirthdayCurrentMonthViews
orderby tab.Birthday ascending
select tab).ToList();
string customFormat = "MMM d";
var ud = record.Select(d => new
{
d.FirstLast,
Formattedate = d.Birthday.ToString(customFormat)
})
.Distinct()
.OrderByDescending(d => d.FormattedDate);
this.grdBirthdays.DataSource = record;
this.grdBirthdays.DataBind();
的问题是,我一直得到错误:“不超载的方法‘的ToString’需要1个arguements”
,我见过的例子做这种方式,所以我在亏损为什么它不会接受它。
如果你能帮助我,这将是伟大的。我只希望在当天GridView上的行。谢谢。
BirthdayCurrentMonthView:在C#
SELECT EmployeeID, ActiveDirectoryName, FirstName, LastName, FirstName + ' ' + LastName AS FirstLast, Birthday, Anniversary, IsActive
FROM dbo.Employee
WHERE (DATEPART(month, Birthday) = DATEPART(month, GETDATE()))
EmployeeID (int, not null)
ActiveDirectoryName (varchar(100), null)
FirstName (varchar(50), not null)
LastName (varchar(100), not null)
FirstLast (varchar(151), not null)
Birthday (datetime, null)
Anniversary (datetime, null)
IsActive (bit, null)
生日定义:
public Nullable<global::System.DateTime> Birthday
{
get
{
return _Birthday;
}
set
{
OnBirthdayChanging(value);
ReportPropertyChanging("Birthday");
_Birthday = StructuralObject.SetValidValue(value);
ReportPropertyChanged("Birthday");
OnBirthdayChanged();
}
}
UPDATE:
解决方案:
List<BirthdayCurrentMonthView> record =
(from tab in db.BirthdayCurrentMonthViews
orderby ((DateTime)tab.Birthday).Day ascending
select tab).ToList();
谢谢大家!
听起来像Birthday
未被识别为DateTime
。如果你这样做会发生什么:
((DateTime)d.Birthday).ToString(customFormat)
这应该强制生日成为日期时间。请记住,如果这不是有效的日期时间,那么它会引发错误。
但是,您应该先运行您的OrderBy
声明,然后执行格式设置。订购一个字符串将按ABC排序,而不是按日期排序。
你正在回答他所问的内容,但并不是真正在做什么 - 这将最终将日期排序为文本,这只会偶尔得到正确的顺序。 – 2012-03-22 19:03:18
感谢这个修复它,虽然它不会使它成为一个日期时间。 – broguyman 2012-03-22 19:04:34
@broguyman如果将日期排序为字符串(除非可排序,如MM-DD),它不会总是按照您期望的顺序排列它们。例如。 7月4日将在12月1日之后,因为J在D之后。 – 2012-03-22 19:09:16
更新,可能的错误是因为可为空吗?可空(Nullable)没有ToString(arg)方法 - 首先获取Value。
如果我有DateTime?
名单,我只是堆栈排序依据的和使用的HasValue
var bdates = new List<Tuple<string, DateTime?>>();
bdates.Add(Tuple.Create("Sally", (DateTime?)new DateTime(1962, 1, 1)));
bdates.Add(Tuple.Create("John", (DateTime?)new DateTime(1988, 2, 1)));
bdates.Add(Tuple.Create("Benny", (DateTime?)new DateTime(1988, 1, 1)));
bdates.Add(Tuple.Create("Joe", (DateTime?)new DateTime(1988, 1, 2)));
bdates.Add(Tuple.Create("Bob", (DateTime?)null));
var v = bdates
.Where(bdate => bdate.Item2.HasValue)
.OrderBy(bdate => bdate.Item2.Value.Day)
.OrderBy(bdate => bdate.Item2.Value.Month);
你对空列表上的'OrderBy'有什么期望? – 2012-03-22 18:55:04
好吧,所以我复制粘贴得太快 - 这就是我想要快速堆栈溢出! – payo 2012-03-22 18:57:28
我认为应该是'月',然后'日',而不仅仅是'月'。 (因为闰年,它不会是'DayOfYear') – 2012-03-22 18:57:51
这有什么错呢?
List<BirthdayCurrentMonthView> record =
(from tab in db.BirthdayCurrentMonthViews
orderby tab.Birthday.Day ascending
select tab).ToList();
DateTime.Date是您要求的。很明显,我仍然假设你的数据上下文映射为Birthday作为DateTime
由于某种原因,它不会接受这一点。 – broguyman 2012-03-22 18:58:31
我认为应该是'月',然后'日',而不仅仅是'日'。那会在1月2日之前提前2月1日。 – 2012-03-22 18:59:00
@broguyman你应该更具体。它会接受什么呢? – 2012-03-22 18:59:39
像生日一样的声音不是日期时间。你能确认它的类型 – 2012-03-22 18:47:49
它是LINQ的对象还是某种ORM LINQ? – 2012-03-22 18:48:17
正如康拉德提到的,你可以向我们展示BirthdayCurrentMonthView的模式吗? – Slugart 2012-03-22 18:52:04