LINQ列表中获取最后一个元素

18
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。”
为什么会这样说?我没有声明invoice为List``` invoice```吗?
非常感谢任何帮助。 谢谢
编辑 感谢大家的回复,我尝试了你们所有人建议的方法,每次都会出现错误:不支持查询运算符“LastOrDefault”。
另外,我实际上还没有解释我正在尝试做什么,这可能会导致问题。 我有一个包含所有发票的表格,每个发票都有一个单独的“id”。但是每个记录都将具有SiteIdentifier列,该列在不同的发票中多次使用。 因此,每个站点可能有多个发票。
试图获取站点最近的发票。 所以说发票
id SiteIdentifier 
73 25
74 25
75 25

我正在尝试获取所有 SiteIdentifier == this.SiteIdentifier(例如25)的记录,然后获取最新的记录,这将是发票编号为75。

有人有任何想法吗? 再次感谢所有帮助

3个回答

30

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

第二个示例可以工作,但仅适用于“第一个或默认值”。我担心我需要的是数据库中最近的记录。.last会抛出错误:“不支持查询运算符'Last'”,而lastordefault与原始帖子中的错误相同。你有什么想法吗? - John
@John 这就是你首先下订单的原因。我假设具有最大ID的记录是最近的记录。远程序列不像内存序列那样运行,它没有办法决定哪个是最后一个,除非你告诉它如何处理。这就是为什么不支持LastOrDefault,你必须使用FirstOrDefault。 - Ufuk Hacıoğulları

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

0

LastOrDefault 会返回一个单独的元素,而不是一个 List。这样做可以解决问题:

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

1
真的很低效!将查询数据库中的所有记录,并在应用程序端而非数据库端获取最后一条记录。 - MarcinJuraszek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接