2012-03-15 51 views
2

我有一个名为Ticket的对象,它包含一个名为TicketActions的对象列表。票据对象有一个名为Date_Closed场和操作对象有一个名为ACTION_DATE场:使用linq按门票未关闭的最低日期订购门票?

Ticket 
    Date_Closed 
    TicketActions 
     -Action_Date 

我试图做的是为了基于每个行动的最新日期门票的名单(名单)票据没有Date_Closed值的升序。目标是将此列表加载到列表视图中,并以在页面上按顺序显示票据的方式显示票据,将最长时间的票据放在顶部而不需要采取行动。那有意义吗?

这里是我结束了至今不工作:

protected List<FullTicket> BuildTickets(int ticketsToShow) 
{ 
    using (var db = new SupportLogDBDataContext()) 
    { 
     var result = 
      (from ticket in db.Support_Tickets 
      join status in db.Ticket_Statuses on ticket.Status_ID equals status.ID 
      select new FullTicket 
      { 
       TicketID = ticket.ID, 
       DateOpened = (DateTime)ticket.Date_Opened, 
       DateClosed = (DateTime)ticket.Date_Closed, 
       Subject = ticket.Subject, 
       Status = new KeyPair { Key = status.Status, Value = status.ID }, 
       CreatedBy = new GuidPair { Key = ticket.Reported_By, Value = (Guid)ticket.AD_GUID }, 
       TicketActions = 
        (from a in db.Ticket_Actions 
        where a.Ticket_ID == ticket.ID 
        select a).ToList() 
      }).Take(ticketsToShow).ToList(); 
     result.OrderBy(i => i.TicketActions.Where(i.DateClosed == null).Max()); //error on this line (invalid arguments) 
     return result; 
    }   
} 
+0

有问题的简单错误,可能是您的问题。 'result = result.OrderBy ...' – 2012-03-15 16:58:09

回答

1

大卫B的分析略有偏差。行...

result.OrderBy(i => i.TicketActions.Where(i.DateClosed == null).Max()); 

...不能编译,因为自变量到Where方法不是lambda表达式或委托。

我建议这个解决方案(假设TicketAction类型的相关属性为ActionDate):

return result.Where(i => i.DateClosed == null) 
    .OrderBy(i => i.TicketActions.Max(a => a.ActionDate)); 

或者,在查询理解语法:

return from i in result 
    where i.DateClosed == null 
    orderby i.TicketActions.Max(a => a.ActionDate) 
    select i; 
1

下面是一些简单的代码。

var sorted = tickets.Where(t => t.DateClosed == null) 
        .OrderBy(t => t.TicketActions.Max(ta => ta.Action_Date.Ticks)); 

对不起,我更喜欢LINQ函数的语法,但如果你想在查询语法,它不应该太难转换。

1
result.OrderBy(i => i.TicketActions.Where(i.DateClosed == null).Max()); 

由于没有定义TicketActions.Max(),因此该行生成错误。 您需要将TicketAction投影到Max'd中。例如:

result.OrderBy(i => 
    i.TicketActions 
    .Where(ta => i.DateClosed == null) 
    .Select(ta => ta.Id) 
    .Max() 
); 

还要注意:

  1. 排序依据不修改其源。 OrderBy 返回一个有序的IEnumerable,你没有在任何地方分配。
  2. OrderBy的enumerable被延期,而你想要一个List结果,所以你应该调用ToList。
  3. 您正在访问查询外部的Ticket.TicketActions。这将导致一个数据库往返每票加载该属性。

这里是一个修改您的查询,避免通过订购和查询内使用的导航性能上述问题。

from ticket in db.Support_Tickets 
where ticket.DateClosed == null 
let lastDate = ticket.TicketActions 
    .Select(ta => ta.ActionDate) 
    .OrderByDescending(date => date) 
    .FirstOrDefault() 
let ticketStatus = ticket.TicketStatus 
order by lastDate 
select new FullTicket 
{ 
    ... 
} 
+0

TicketActions是一个列表,它确实可以是'Max'ed。问题在于“Where”的论点。此外,您的'lastDate'变量实际上会保存最新的操作本身,而不是最新操作的日期。 – phoog 2012-03-15 16:48:00

+0

@phoog你怎么能最大的东西是不可比的? – 2012-03-15 16:49:56

+0

通过传递一个lambda从每个元素中提取一个数值。 – phoog 2012-03-15 16:51:38

2

人回复快速这里!

试试这个:

var result = (from ticket in tickets 
       where !ticket.DateClosed.HasValue 
       select ticket).OrderByDescending(t => (from a in t.TicketActions 
                select a.ActionDate).Max()); 

从这里你可以采取,因为你需要尽可能多的。

相关问题