使用 Linq 的 Where 子句中的子字符串
Posted
技术标签:
【中文标题】使用 Linq 的 Where 子句中的子字符串【英文标题】:Substring in Where Clause using Linq 【发布时间】:2021-12-29 15:01:07 【问题描述】:我正在尝试根据使用 Linq 从表中提取的商店 ID 上传文件。 以下是我获取文件的方式:
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.ToString()))
.ToList();
文件“名称”的格式是“123456789012_12345”,其中StoreId 是下划线(“_”)之后的所有内容。 这种情况会带来基于 StoreId 的文件。但是,它也会带来比预期更多的文件,因为它也会在文件名的左侧查找任何匹配的内容。如果我将条件更改为“子字符串”,我不会得到任何结果。
.Where(x => x.Name.Substring(0,13)
.Contains(StoreId.ToString()))
.ToList();
我能做些什么来获得我期望的结果吗?
谢谢!
【问题讨论】:
你试过了吗.Where(r=> r.Name.EndsWith($"_StoreId")
)
【参考方案1】:
那是因为Substring
方法会返回名称的左边部分。
var str = "123456789012_12345";
var str2 = str.Substring(0, 13);
Console.WriteLine(str2); // 123456789012_
你可以试试:
var str2 = str.Substring(13, str.Length - 13);
或
var str2 = str.Split('_')[1];
或
.Where(x => x.Name.EndsWith($"_StoreId"));
【讨论】:
Arthur Edgarov,“拆分”解决方案对我有用。谢谢! @1moreLearner,很高兴我能帮上忙 :) 对于str.Substring(13, str.Length - 13)
语法,可以使用新的范围运算符。它将简化为:str[13..]
@Eldar,是的,但我们不知道作者使用的是什么语言版本。但是,无论如何都值得指出。谢谢【参考方案2】:
我会用这个,因为13不是可靠的数字,它可以改变
var storeId = StoreId.ToString();
....
.Where(x => x.Name.Substring(x.Name.IndexOf("_")+1) == storeId)
.ToList();
【讨论】:
以上是关于使用 Linq 的 Where 子句中的子字符串的主要内容,如果未能解决你的问题,请参考以下文章
如何在linq where子句中将int与字符串进行比较[重复]
Linq to Entities 中的动态 where 子句 (OR)