如何在Linq的Where子句中使用Substring筛选匹配StoreId的上传文件
解决方案
问题原因
你的两种写法都存在逻辑偏差:
- 第一种使用
Contains是全文件名模糊匹配,只要任意位置出现StoreId就会命中,自然会匹配到前缀包含StoreId的错误结果 - 第二种使用
Substring(0,13)是截取文件名的前13位(刚好对应12位前缀+下划线),而StoreId存在于下划线之后,在前13位中不可能匹配到,所以查询不到任何结果
正确实现
你只需要按下划线拆分文件名,取对应位置的内容和StoreId做精确匹配即可,同时可以加容错判断避免无下划线的异常文件名导致报错:
var uploadedFiles = Files.OrderByDescending(x => x.LastWriteTime) .Select(x => new { Name = x.Name, Date = Convert.ToDateTime(x.LastWriteTime).ToString("MM/dd/yyyy") }) .Where(x => // 先判断文件名包含下划线,避免拆分异常 x.Name.Contains("_") // 按下划线拆分后取最后一段,和StoreId完全匹配 && x.Name.Split('_').Last() == StoreId.ToString()) .ToList();
特殊场景适配
如果你的StoreId本身可能包含下划线,或者需要取下划线之后的全部内容(而非按下划线拆分的最后一段),可以修改拆分逻辑,只拆分一次取后半段即可:
.Where(x => x.Name.Contains("_") && x.Name.Split(new[] {'_'}, 2).Last() == StoreId.ToString())
内容的提问来源于stack exchange,提问作者1moreLearner
相关产品推荐
相关产品推荐

