4

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

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

4

5 回答 5

11

如果必须包含您只需要非空文件名。您也可以使用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();
于 2014-07-01T09:25:28.237 回答
9

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

objContext.SchedulesAndFiles
          .Where(x => x.ScheduleId == scheduleId && x.Filename != "")
          .OrderByDescending(x => x.ID)
          .First().Filename;
于 2014-07-01T09:23:27.237 回答
3

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

var tempFileName = objContext.SchedulesAndFiles
                   .Where(x => x.ScheduleId == scheduleId 
                            && x.Filename != null && x.Filename != '')
                   .ToList().LastOrDefault();
if(tempFileName != null)
{
    // Do something
}
于 2014-07-01T09:31:05.730 回答
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 的每个项目,这将获取具有非空文件名的所有项目,按 ID 降序排序(假设在较低 ID 之后插入较高 ID),获取 First() (应该支持)并获取它的文件名。

请注意,如果没有令人满意的文件名,您可能会遇到NullPointerExceptionon 。First()

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

于 2014-07-01T09:32:15.910 回答
0

你可以试试这个查询。我认为您必须在选择文件名之前发出最后一个或默认值

 var tempFileName = objContext.SchedulesAndFiles
                               .Where(x => x.ScheduleId == scheduleId && ! string.IsNullOrEmpty(e.FileName))
                               .FirstOrDefault().Select(x => x.Filename);
于 2014-07-01T09:25:28.730 回答