2012-01-23 196 views
0

我有一个具有ListOf订单的Customer类。我正在尝试按日期排序所有订单。日期 “order_date的” 是YYYY字符串:MM:DD HH:MM:SS”格式LINQ OrderBy不排序

下面是代码Lambda表达式:

Dim orders() = Customer.Orders.ToArray().OrderBy(Function(c) c.order_date).ToArray() 

这似乎并不被排序的日期。

我试图转换为DateTime如果order_date的为空或有一定的价值,但如果order_date的日期是空白的,然后它抛出一个异常,工作正常。

Dim orders() = Customer.Orders.OrderBy(Function(c) (Not String.IsNullOrEmpty(c.order_date))).ThenBy(Function(c) Convert.ToDateTime(c.order_date)).ToArray() 
+0

什么的第一种方法的问题?什么是输入/输出? –

+0

订单未排序。 – Amir

+0

输出与输入相同吗? –

回答

0

我可以向您正在使用VB看我使用C#,但你应该能够翻译

var orders = Customer.Orders.ToList().Sort((a,b)=> a.order_date.Compare(b.order_date)) 

MSDN有一个完整的文章here

如果你要使用LINQ2SQL /实体,然后你想要让他们回来之前对数据库排序依据记忆。在排序之前,您不需要执行ToArray()。也考虑对数据库上发生的代码使用linq语法。它清楚地给开发商,你要查询

var orders = (from o in DataContext.Orders 
       where o.Customer.Id == customerId 
       orderby o.order_date 
       select o) 

下面是另一个例子

static void Main(string[] args) 
    { 
     var dates = new List<DateTime?>() 
        { 
         null, 
         null, 
         new DateTime(2001, 2, 3), 
         null, 
         new DateTime(2001, 12, 3), 
         new DateTime(2021, 12, 3) 
        }; 

     dates.Sort(CompareDates); 

    } 

    private static int CompareDates(DateTime? x, DateTime? y) 
    { 
     if (x == null) 
     { 
      return y == null ? 0 : -1; 
     } 
     return y == null ? 1 : x.Value.CompareTo(y.Value); 
    } 
+0

隐式或显式调用'Comapre'方法有什么区别? –

+0

这是否意味着我必须编写一个比较函数。 Customer.Orders.ToList()。Sort((a,b)=> a.order_date.Compare(b.order_date)) 不会编译 – Amir

+0

我使用比较方法为您提供了一个完整的示例,它使用可空日期时间 – Peter