.NET: LINQ's Last()

c#, linq

Solution

Brandon has posted a solution, but it requires copying the whole list in memory.

If you just want to "transition" from database queries to in-process, you can use `AsEnumerable`:

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

Having said that, you possibly do want to call ToList(), but earlier - to avoid having to execute the query once for the count, and once for the last value:

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;
}

That will execute the database query once, but only fetch the first 100 records into memory. Of course, it falls down somewhat if you were going to use `postTimes` elsewhere...

Problem

I'm new to LINQ and LINQ to SQL and don't understand what's wrong with this code. The `Excetpion.Message` I get is "Query operator 'Last' is not supported." What I'm trying to do is get the earliest `LastActivityUtc`out of the latest 100. The code follows. ``` 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; } ```

Original source