【问题标题】:Substring in Where Clause using Linq使用 Linq 的 Where 子句中的子字符串
【发布时间】: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}"))

标签: c# linq


【解决方案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();

【讨论】:

    猜你喜欢
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多