我知道这个问题被问了很多次,我在网上搜索了大多数解决方案,但似乎没有一个适合我。我有一个这样结构的表:
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以不查找空格/制表符等内容。