Подтвердить что ты не робот

Последнее и 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: Оператор запроса "Реверс" не поддерживается.

4b9b3361

Ответ 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();