Linq查询获取最后一条记录

Apo*_*fix 2 c# linq linq-query-syntax

我知道这被问了很多次,我在网上搜索了大部分解决方案,但似乎没有任何东西可以帮我.我有一个这种结构的表:

ID | ScheduleId | Filename | Description
 1 |     10     |          |  ....
 2 |     10     | test.txt |  .....
Run Code Online (Sandbox Code Playgroud)

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

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

var tempFileName = objContext.SchedulesAndFiles
                           .Where(x => x.ScheduleId == scheduleId)
                           .OrderByDescending(x => x.ScheduleId)
                           .Take(1).Select(x => x.Filename);
Run Code Online (Sandbox Code Playgroud)

这不起作用,虽然我明白为什么它不:

var tempFileName = from e in objContext.SchedulesAndFiles
                   where e.ScheduleId == scheduleId 
                   orderby e.ScheduleId descending
                   select e.Filename;
Run Code Online (Sandbox Code Playgroud)

调用.Last()或.LastOrDefault()抛出异常(The query operator 'LastOrDefault' is not supported.)

ess*_*kar 7

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


Sel*_*enç 6

您应该根据ID而不是ScheduleId过滤记录,并过滤具有空的记录Filename:

objContext.SchedulesAndFiles
          .Where(x => x.ScheduleId == scheduleId && x.Filename != "")
          .OrderByDescending(x => x.ID)
          .First().Filename;
Run Code Online (Sandbox Code Playgroud)

  • 如果什么也没找到,这会抛出 (2认同)