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

Получить последний в списке LINQ

Context db = new Context();
List<Invoice> invoice =
(from LocalInvoice in db.Invoices
where LocalInvoice.Site_Id == this.SiteIdentifier
select LocalInvoice).ToList();

Возвращает список записей. Я хочу выбрать последнее в списке. Я пробовал .ToList().LastOrDefault(); но ошибка im get не может преобразовать тип 'invoice' в 'System.Collections.Generic.List.

Почему это говорит, что я не объявлял счет-фактуру как список List<Invoice> invoice

Любая помощь очень ценится. Та


ИЗМЕНИТЬ Спасибо за ответ, все, что я пробовал, что вы все посоветовали, и каждый раз, когда я получаю сообщение об ошибке: Оператор запроса "LastOrDefault" не поддерживается.

Также Я действительно не объяснил, что я пытаюсь сделать в целом, что может вызвать проблемы. У меня есть таблица, содержащая все счета-фактуры, каждая из которых имеет отдельный идентификатор. Однако каждая запись будет иметь столбец SiteIdentifier, который используется несколько раз для разных счетов-фактур. Поэтому каждый сайт может иметь несколько счетов-фактур.

Попытка получить самую последнюю учетную запись для сайта. Так скажите счет-фактуру

id SiteIdentifier 
73 25
74 25
75 25

Я пытался получить все записи, где SiteIdentifier == this.SiteIdentifier(например, 25), а затем получить самую последнюю запись, которая будет иметь идентификатор счета-фактуры 75.

У кого-нибудь есть идеи? Еще раз спасибо за помощь

4b9b3361

Ответ 1

LastOrDefault вернет один элемент. Вы не должны вызывать ToList, не применяя сначала фильтр, он будет извлекать все строки из базы данных, пока вам просто нужен.

var invoice = db.Invoices.LastOrDefault(s => s.Site_Id == this.SiteIdentifier);

Также вам нужно применить порядок, если вы запрашиваете реляционную таблицу. LastOrDefault имеет смысл только в коллекциях в памяти. Похоже, что он не поддерживается в EF и будет генерировать исключение.

Лучшее решение - инвертировать порядок и использовать метод FirstOrDefault:

var invoice = db.Invoices.OrderByDescending(s => s.Id) 
                         .FirstOrDefault(s => s.Site_Id == this.SiteIdentifier);

Ответ 2

LastOrDefault вернет экземпляр счета-фактуры, а не сбор, поэтому измените тип переменной.

Invoice invoice =
   (from LocalInvoice in db.Invoices
    where LocalInvoice.Site_Id == this.SiteIdentifier
    select LocalInvoice).LastOrDefault();

или более чистое:

var invoice = db.Invoices.LastOrDefault(i => i.Site_Id == this.SiteIdentifier);

Ответ 3

LastOrDefault вернет один элемент, а не List. Это будет работать:

Invoice invoice =
    (from LocalInvoice in db.Invoices
     where LocalInvoice.Site_Id == this.SiteIdentifier
     select LocalInvoice)
    .LastOrDefault();