.NET:LINQ的Last()

时间:2009-08-11 21:04:16

标签: c# linq

我是LINQ和LINQ to SQL的新手,并不明白这段代码有什么问题。我得到的Excetpion.Message

  

“不支持查询运算符'Last'。”

我要做的是从最新的100中获取最早的LastActivityUtc。代码如下。

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

2 个答案:

答案 0 :(得分:20)

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,它会有所下降......

答案 1 :(得分:4)

在postTimes上调用.ToList(),然后尝试使用.Last()

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