Linq查询获取最后一条记录



我知道这个问题被问了很多次,我在网上搜索了大多数解决方案,但似乎没有一个适合我。我有一个这样结构的表:

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.)

如果必须包含您只想要非空文件名。您也可以使用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();

您应该基于ID而不是ScheduleId对记录进行排序,并过滤具有空Filename的记录:

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

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

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

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

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

最后一次尝试:

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,您可能会在First()上遇到NullPointerException

此外,您可能需要规范化/trim以不查找空格/制表符等内容。

相关内容

  • 没有找到相关文章

最新更新