.NET: LINQ Last()

Я новичок в LINQ и LINQ to SQL и не понимаю, что с этим кодом не так. Excetpion.Message Я получаю

"Оператор запроса" Последний "не поддерживается."

То, что я пытаюсь сделать, это получить самый ранний LastActivityUtc из последних 100. Код следует.

var postTimes = from post in db.Post
                where post.LastActivityUtc != null
                orderby post.LastActivityUtc descending
                select post.LastActivityUtc;

DateTime startDate = DateTime.MinValue;

if (postTimes.Count() >= 2)
{
    startDate = postTimes.Take(100).Last().Value;
}

Ответ 1

Brandon опубликовал решение, но требует копирования всего списка в памяти.

Если вы просто хотите "перейти" от запросов к базе данных к процессу, вы можете использовать AsEnumerable:

startDate = postTimes.Take(100).AsEnumerable().Last().Value;

Сказав это, вы, возможно, захотите вызвать ToList(), но раньше - чтобы избежать необходимости выполнить запрос один раз для подсчета и один раз для последнего значения:

var postTimes = (from post in db.Post
                where post.LastActivityUtc != null
                orderby post.LastActivityUtc descending
                select post.LastActivityUtc).Take(100).ToList();

DateTime startDate = DateTime.MinValue;

if (postTimes.Count >= 2)
{
    startDate = postTimes.Last().Value;
}

Это выполнит запрос базы данных один раз, но только извлечет первые 100 записей в память. Конечно, он несколько падает, если вы собираетесь использовать postTimes в другом месте...

Ответ 2

Вызовите .ToList() в postTimes, а затем попробуйте использовать .Last()

startDate = postTimes.Take(100).ToList().Last().Value;