Последнее и LastOrDefault не поддерживаются
Я пытаюсь получить первое значение в списке и последнее значение. Оператор запроса 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();
}
Update:
--Errors -
Попытка 1: Оператор запроса "Последний" не поддерживается.
Попытка 2: Оператор запроса "LastOrDefault" не поддерживается.
Попытка 3: Оператор запроса "Реверс" не поддерживается.
Ответы
Ответ 1
- Вместо того, чтобы помещать его в собственный список, вызывая
ToList()
или ToArray()
, я бы предпочел использовать AsEnumerable()
.
- Дополнительно, как и другие, вы должны попробовать
OrderByDescending()
- Вместо
Count()
я использовал бы Any()
.
Ответ 2
либо вы переключите свой OrderBy на
.OrderByDescending(p => p.BillID)
(и сначала используйте), или вы сделаете что-то вроде
purchaseBills.ToArray().Last()
если это не дорого.
Ответ 3
Last
не поддерживается базовым БД. Вы должны попробовать другие методы:
-
Запустите запрос с помощью OrderByDescending
, чтобы ваш запрос был первым.
-
Скопируйте свой запрос LINQ как обычно, но применяйте Linq2Sql, чтобы отобразить его в коллекции CLR, и тогда у вас будет свободный доступ ко всему локально, включая Last
. Пример:
var bills = purchaseBills.ToList();
var last = bills.Last();
Ответ 4
Проблема заключается в том, что нет простого перевода в SQL для Last
или Reverse
, поэтому либо конвертируйте его в что-то в память (ToList
, ToArray
), если не будет слишком большого количества записей, или вы можете запустить запрос во второй раз, OrderByDescending
вместо OrderBy
и использовать First
.
Ответ 5
Я стараюсь не использовать LastOrDefault()
, потому что когда-то это не работает или не поддерживается.
Я сортирую id
на desc
, а затем захватываю первые записи.
.OrderByDescending(o=>o.id)
.FirstOrDefault(s => s.Name == Name)
Ответ 6
Это связано с тем, что оператор Last
пытается отправить сервер SQL, у которого нет соответствующей команды. Как только решение должно положить ToArray()
или Tolist()
в конце вашего вызова db, что делает эту строку явным вызовом для получения данных (вместо того, чтобы загружать загрузку по каждой из других строк).
Ответ 7
Еще один способ получить последний элемент без orderbydescending и загрузить все сущности:
var lastBill = purchaseBills
.Where(f => f.BillID == purchaseBills.Max(f2 => f2.BillID))
.FirstOrDefault();