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