【问题标题】:get last in LINQ list在 LINQ 列表中排在最后
【发布时间】:2013-03-27 13:18:27
【问题描述】:
Context db = new Context();
List<Invoice> invoice =
(from LocalInvoice in db.Invoices
where LocalInvoice.Site_Id == this.SiteIdentifier
select LocalInvoice).ToList();

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

为什么我没有将发票声明为列表List&lt;Invoice&gt; invoice

非常感谢任何帮助。 塔


编辑 感谢大家的回复,我已经尝试了你们的建议,每次我都收到错误:不支持查询运算符'LastOrDefault'。

另外我还没有真正解释我正在尝试做的整体可能会导致问题的事情。 我有一张包含所有发票的表格,每张发票都有一个单独的“id”。但是,每条记录都有一个 SiteIdentifier 列,该列多次用于不同的发票。 所以每个站点可能有多个发票。

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

id SiteIdentifier 
73 25
74 25
75 25

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

有人有什么想法吗? 再次感谢大家的帮助

【问题讨论】:

    标签: asp.net linq


    【解决方案1】:

    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 抛出错误 The query operator 'Last' is not supported.,并且 lastordefault 与我原帖中的原始错误相同。你有什么想法吗?
    • @John 这就是您首先订购的原因。我假设具有最大 Id 的记录将是最近的记录。远程序列不像内存中的序列,它无法确定哪个是最后一个,除非你告诉它如何。这就是不支持 LastOrDefault 的原因,您必须使用 FirstOrDefault。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      LastOrDefault 将返回单个元素,而不是 List。这会起作用:

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

      【讨论】:

      • 真是低效!将查询数据库中的所有记录,并在应用程序上最后一次处理,而不是在数据库端。
      猜你喜欢
      • 2021-09-20
      • 1970-01-01
      • 2020-04-01
      • 2020-07-18
      • 2011-09-21
      • 2021-10-23
      • 1970-01-01
      相关资源
      最近更新 更多