我试图获取列表中的第一个值和最后一个值。支持查询运算符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”。
答案 0 :(得分:46)
ToList()
或ToArray()
将其放入自己的列表中,而是希望使用AsEnumerable()
。OrderByDescending()
Count()
我会使用Any()
。答案 1 :(得分:21)
要么将OrderBy切换为
.OrderByDescending(p => p.BillID)
(并先使用)或你做的事情
purchaseBills.ToArray().Last()
如果这不贵。
答案 2 :(得分:15)
Last
。你应该尝试其他技术:
使用OrderByDescending
运行您的查询,以便首先找到您要求的项目。
像往常一样编码LINQ查询,但强制Linq2Sql将其呈现给CLR集合,然后您可以在本地免费访问所有内容,包括Last
。例如:
var bills = purchaseBills.ToList();
var last = bills.Last();
答案 3 :(得分:10)
问题是,Last
或Reverse
无法轻松转换为SQL,因此如果有,请将其转换为内存中的内容(ToList
,ToArray
)记录太多,或者您可以第二次运行查询,使用OrderByDescending
代替OrderBy
并使用First
。
答案 4 :(得分:5)
我尽量不使用LastOrDefault()
,因为有时候它不起作用或支持。
我按id
对desc
进行排序,然后获取第一条记录。
.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();