2011-08-31 73 views
32

我想获得列表中的第一个值和最后一个值。查询运算符First()受支持,但Last()LastOrDefault()给出错误。我是否以不正确的方式使用Last()运算符?最后和LastOrDefault不支持

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:查询操作 '最后' 不支持。

尝试2:查询运算符'LastOrDefault'不受支持。

尝试3:查询运算符'Reverse'不受支持。

+0

什么错误?你在使用什么查询提供程序? –

+0

[LINQ To Entities不能识别方法Last。真的吗?(http://stackoverflow.com/questions/7293639/linq-to-entities-does-not-recognize-the-method-last-really)。这个问题在另一个问题前一个月问过,但这个问题有更好的答案。 –

回答

35
  • 而不是把它变成自己的名单通过调用ToList()ToArray()我宁愿使用AsEnumerable()
  • 另外像其他人一样,你应该尝试OrderByDescending()
  • 而不是Count()我会用Any()
+2

对于任何()建议+1。谢谢:) – Marshal

+1

我发现通过降序排序,然后使用FirstOrDefault()将工作。 –

16

无论您打开排序依据,以

.OrderByDescending(p => p.BillID) 

(以及第一次使用),或者你做这样的事情

purchaseBills.ToArray().Last() 

如果这不是昂贵。

10

的问题是,有没有简单的翻译成SQL的LastReverse,所以要么将其转换为一些存储器(ToListToArray)如果有不会是太多记录,或者你可以运行查询第二次用OrderByDescending代替OrderBy并使用First

2

这与Last运算符试图发送到没有相应命令的SQL服务器有关。一旦解决方案是将ToArray()Tolist()放在你的数据库调用的最后,这使得这一行显式调用来获取数据(而不是每个其他行上的延迟加载)。

12

Last不受后端数据库支持。你应该尝试其他方法:

  1. 运行使用OrderByDescending查询以便您的要求的项目是第一位的。

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

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

我尽量不要使用LastOrDefault(),因为有时它不工作或不支持。 我正在排序iddesc然后抓取第一条记录。

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

同样的问题,我切换LINQ使用orderby降序,然后使用FirstOrDefault()而不是LastorDefault。 –

1

另一种方式得到最后一个元素没有orderbydescending并加载所有实体:

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