Linq查询获取最后一条记录

时间:2014-07-01 09:20:35

标签: c# linq linq-query-syntax

我知道很多次都会问这个问题并且我已经在网上搜索了大部分解决方案,但似乎没有什么能够帮助我。我有一个这种结构的表:

ID | ScheduleId | Filename | Description
 1 |     10     |          |  ....
 2 |     10     | test.txt |  .....

我希望通过传递ScheduleId来获取最后一个非空Filename(例如,获取" test.txt"在这种情况下)。

我尝试了很多东西,似乎没有任何东西能让我获得文件名。这是最后一个:

var tempFileName = objContext.SchedulesAndFiles
                           .Where(x => x.ScheduleId == scheduleId)
                           .OrderByDescending(x => x.ScheduleId)
                           .Take(1).Select(x => x.Filename);

这也不起作用,虽然我理解为什么它没有:

var tempFileName = from e in objContext.SchedulesAndFiles
                   where e.ScheduleId == scheduleId 
                   orderby e.ScheduleId descending
                   select e.Filename;

致电.Last().LastOrDefault()会引发异常(The query operator 'LastOrDefault' is not supported.

5 个答案:

答案 0 :(得分:6)

如果必须包含您只想要非空文件名。您也可以使用ToList()来完成查询,然后FirstOrDefault()应按预期工作,尝试

var tempFileName = objContext.SchedulesAndFiles
                             .Where(x 
                                 => x.ScheduleId == scheduleId 
                                 && x.Filename != null 
                                 && x.Filename != "")
                             .OrderByDescending(x => x.ScheduleId)
                             .Take(1)
                             .Select(x => x.Filename)
                             .ToList()
                             .FirstOrDefault();

答案 1 :(得分:5)

您应该根据ID而不是ScheduleId对记录进行排序,并过滤空Filename的记录:

objContext.SchedulesAndFiles
          .Where(x => x.ScheduleId == scheduleId && x.Filename != "")
          .OrderByDescending(x => x.ID)
          .First().Filename;

答案 2 :(得分:0)

您可以尝试此查询。我认为你必须在选择文件名

之前发出最后一个或默认值
 var tempFileName = objContext.SchedulesAndFiles
                               .Where(x => x.ScheduleId == scheduleId && ! string.IsNullOrEmpty(e.FileName))
                               .FirstOrDefault().Select(x => x.Filename);

答案 3 :(得分:0)

一种选择是在尝试使用LastOrDefault()之前调用ToList()或AsEnumerable()。

var tempFileName = objContext.SchedulesAndFiles
                   .Where(x => x.ScheduleId == scheduleId 
                            && x.Filename != null && x.Filename != '')
                   .ToList().LastOrDefault();
if(tempFileName != null)
{
    // Do something
}

答案 4 :(得分:0)

最后的尝试:

var tempFileName = objContext.SchedulesAndFiles
                         .Where(x 
                             => x.ScheduleId == scheduleId 
                             && x.Filename != null 
                             && x.Filename != "")
                         .OrderByDescending(x => x.ID)
                         .First()
                         .Select(x => x.Filename);

对于具有此scheduleId的每个项目,这将获取具有非空fileName的所有项目,按ID降序排序(假设在较低ID之后插入较高ID),获取First()(应支持并获取其FileName。

请注意,如果没有令人满意的fileName,您可能会在NullPointerException上遇到First()

此外,您可能需要规范化/修剪以找不到空格/制表符等。