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

谢谢大家!

+1

像生日一样的声音不是日期时间。你能确认它的类型 – 2012-03-22 18:47:49

+0

它是LINQ的对象还是某种ORM LINQ? – 2012-03-22 18:48:17

+0

正如康拉德提到的,你可以向我们展示BirthdayCurrentMonthView的模式吗? – Slugart 2012-03-22 18:52:04

听起来像Birthday未被识别为DateTime。如果你这样做会发生什么:

((DateTime)d.Birthday).ToString(customFormat) 

这应该强制生日成为日期时间。请记住,如果这不是有效的日期时间,那么它会引发错误。

但是,您应该先运行您的OrderBy声明,然后执行格式设置。订购一个字符串将按ABC排序,而不是按日期排序。

+1

你正在回答他所问的内容,但并不是真正在做什么 - 这将最终将日期排序为文本,这只会偶尔得到正确的顺序。 – 2012-03-22 19:03:18

+0

感谢这个修复它,虽然它不会使它成为一个日期时间。 – broguyman 2012-03-22 19:04:34

+0

@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); 
+0

你对空列表上的'OrderBy'有什么期望? – 2012-03-22 18:55:04

+1

好吧,所以我复制粘贴得太快 - 这就是我想要快速堆栈溢出! – payo 2012-03-22 18:57:28

+1

我认为应该是'月',然后'日',而不仅仅是'月'。 (因为闰年,它不会是'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

+0

由于某种原因,它不会接受这一点。 – broguyman 2012-03-22 18:58:31

+0

我认为应该是'月',然后'日',而不仅仅是'日'。那会在1月2日之前提前2月1日。 – 2012-03-22 18:59:00

+1

@broguyman你应该更具体。它会接受什么呢? – 2012-03-22 18:59:39