Получить последний в списке 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.
У кого-нибудь есть идеи?
Еще раз спасибо за помощь
Ответы
Ответ 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();