Last和LastOrDefault不受支持

时间:2011-08-31 06:51:53

标签: c# .net linq linq-to-sql

我试图获取列表中的第一个值和最后一个值。支持查询运算符First(),但Last()LastOrDefault()会出错。我是否以错误的方式使用Last()运算符?

   var purchaseBills = db.PurchaseBills.OrderBy(p => p.BillID);

   if (purchaseBills.Count() >0)
   {
       var firstBill= purchaseBills.First(); //This is supported

       //Attempt 1                    
       var lastBill = purchaseBills.Last(); // Not supported

       //Attempt 2
       var lastBill = purchaseBills.LastOrDefault(); //Not supported

       //Attempt 3
       var lastBill = purchaseBills.Reverse().First(); //Not supported

       textBoxPurchaseBillFrom.Text = firstBill.BillNo.ToString();
       textBoxPurchaseBillTo.Text = lastBill.BillNo.ToString();
   }

更新 --errors -

  

尝试1:不支持查询运算符“Last”。

     

尝试2:不支持查询运算符“LastOrDefault”。

     

尝试3:不支持查询运算符“Reverse”。

7 个答案:

答案 0 :(得分:46)

  • 不是通过致电ToList()ToArray()将其放入自己的列表中,而是希望使用AsEnumerable()
  • 另外,您应该尝试OrderByDescending()
  • 而不是Count()我会使用Any()

答案 1 :(得分:21)

要么将OrderBy切换为

.OrderByDescending(p => p.BillID)

(并先使用)或你做的事情

purchaseBills.ToArray().Last()

如果这不贵。

答案 2 :(得分:15)

后端数据库不支持

Last。你应该尝试其他技术:

  1. 使用OrderByDescending运行您的查询,以便首先找到您要求的项目。

  2. 像往常一样编码LINQ查询,但强制Linq2Sql将其呈现给CLR集合,然后您可以在本地免费访问所有内容,包括Last。例如:

    var bills = purchaseBills.ToList();
    var last = bills.Last();
    

答案 3 :(得分:10)

问题是,LastReverse无法轻松转换为SQL,因此如果有,请将其转换为内存中的内容(ToListToArray)记录太多,或者您可以第二次运行查询,使用OrderByDescending代替OrderBy并使用First

答案 4 :(得分:5)

我尽量不使用LastOrDefault(),因为有时候它不起作用或支持。 我按iddesc进行排序,然后获取第一条记录。

.OrderByDescending(o=>o.id)
.FirstOrDefault(s => s.Name == Name)

答案 5 :(得分:2)

这与Last运算符正在尝试发送到没有相应命令的SQL服务器这一事实有关。一旦解决方案是在db调用结束时放置ToArray()Tolist(),这使得一行显式调用以获取数据(而不是在每个其他行上进行lazing加载)。 / p>

答案 6 :(得分:1)

另一种方法是获取最后一个元素而不使用orderbydescending并加载所有实体:

var lastBill = purchaseBills
    .Where(f => f.BillID == purchaseBills.Max(f2 => f2.BillID))
    .FirstOrDefault();