在LINQ列表中获得最后一个

时间:2013-03-27 13:18:27

标签: asp.net linq

Context db = new Context();
List<Invoice> invoice =
(from LocalInvoice in db.Invoices
where LocalInvoice.Site_Id == this.SiteIdentifier
select LocalInvoice).ToList();

返回记录列表。我想选择列表中的最后一个。 我试过.ToList().LastOrDefault(); 但是我得到的错误是无法将类型'invoice'转换为'System.Collections.Generic.List。

为什么说我没有将发票声明为列表List<Invoice> invoice

任何帮助非常感谢。 TA


修改 感谢您的回复,大家都尝试过您所有人建议的内容以及每次收到错误:不支持查询运算符“LastOrDefault”。

我还没有解释我整体上要做的事情,这可能会导致问题。 我有一张包含所有发票的表格,每张发票都有一个单独的'id'。但是,每条记录都有一个SiteIdentifier列,该列可以多次用于不同的发票。 因此,每个站点可能有多个发票。

尝试获取该网站的最新发票。 所以说发票

id SiteIdentifier 
73 25
74 25
75 25

我试图获取SiteIdentifier == this.SiteIdentifier(例如25)的所有记录,然后获取最新记录,该记录的发票号为75.

有人有什么想法吗? 再次感谢所有帮助

3 个答案:

答案 0 :(得分:23)

LastOrDefault将返回单个元素。您不应该先调用ToList而不先应用过滤器,它会在您需要时从数据库中检索所有行。

var invoice = db.Invoices.LastOrDefault(s => s.Site_Id == this.SiteIdentifier);

如果要查询关系表,还必须应用排序。 LastOrDefault仅对内存中的集合有意义。看起来它在EF中不受支持并且会抛出异常。

最佳解决方案是反转排序并使用FirstOrDefault方法:

var invoice = db.Invoices.OrderByDescending(s => s.Id) 
                         .FirstOrDefault(s => s.Site_Id == this.SiteIdentifier);

答案 1 :(得分:5)

LastOrDefault将返回Invoice的实例,而不是集合,因此请更改变量类型。

Invoice invoice =
   (from LocalInvoice in db.Invoices
    where LocalInvoice.Site_Id == this.SiteIdentifier
    select LocalInvoice).LastOrDefault();

或更清洁:

var invoice = db.Invoices.LastOrDefault(i => i.Site_Id == this.SiteIdentifier);

答案 2 :(得分:0)

LastOrDefault将返回单个元素,而不是List。这可行:

Invoice invoice =
    (from LocalInvoice in db.Invoices
     where LocalInvoice.Site_Id == this.SiteIdentifier
     select LocalInvoice)
    .LastOrDefault();