Last и LastOrDefault не поддерживаются - PullRequest
37 голосов
/ 31 августа 2011

Я пытаюсь получить первое значение в списке и последнее значение. Оператор запроса 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: оператор запроса «Последний» не поддерживается.

Попытка 2: оператор запроса 'LastOrDefault' не поддерживается.

Попытка 3: оператор запроса 'Обратный' не поддерживается.

Ответы [ 7 ]

46 голосов
/ 31 августа 2011
  • Вместо того, чтобы помещать его в собственный список, вызывая ToList() или ToArray(), я бы предпочел использовать AsEnumerable().
  • Дополнительно, как и другие, вы должны попробовать OrderByDescending()
  • Вместо Count() я бы использовал Any().
21 голосов
/ 31 августа 2011

либо вы переключаете свой OrderBy на

.OrderByDescending(p => p.BillID)

(и используете сначала), либо делаете что-то вроде

purchaseBills.ToArray().Last()

, если это не дорого.

18 голосов
/ 31 августа 2011

Last не поддерживается внутренней БД.Вам следует попробовать другие методы:

  1. Выполните запрос, используя OrderByDescending, чтобы запрошенный элемент был первым.

  2. Кодируйте свой запрос LINQ как обычно, но принудительно заставьте Linq2Sql отобразить его в коллекцию CLR, и тогда у вас будет свободный доступ ко всему локально, включая Last.Пример:

    var bills = purchaseBills.ToList();
    var last = bills.Last();
    
10 голосов
/ 31 августа 2011

Проблема в том, что нет простого перевода в SQL для Last или Reverse, поэтому либо преобразуйте его в нечто в памяти (ToList, ToArray), если не будет слишком много записей или вы можете выполнить запрос во второй раз, используя OrderByDescending вместо OrderBy и используйте First.

6 голосов
/ 09 марта 2016

Я стараюсь не использовать LastOrDefault(), потому что иногда это не работает или не поддерживается. Я сортирую id по desc и затем беру первые записи.

.OrderByDescending(o=>o.id)
.FirstOrDefault(s => s.Name == Name)
2 голосов
/ 31 августа 2011

Это связано с тем, что оператор Last пытается отправить на сервер SQL, который не имеет соответствующей команды.Как только решение состоит в том, чтобы поставить ToArray() или Tolist() в конце вашего вызова db, что делает эту строку явным вызовом для получения данных (вместо того, чтобы выполнять загрузку в каждой из других строк).

1 голос
/ 21 июля 2017

Еще один способ получить последний элемент без упорядочения по убыванию и загрузить все сущности:

var lastBill = purchaseBills
    .Where(f => f.BillID == purchaseBills.Max(f2 => f2.BillID))
    .FirstOrDefault();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...