使用 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 中的 Groupby 和 where 子句

组合字符串时方法语法中的 Where 子句失败

Linq to Entities 中的动态 where 子句 (OR)

C# LINQ 与两个不同数据集上的条件 where 子句连接

概括 linq 查询中的 where 子句