我正在尝试在我的网站上实现一个可以按日期搜索的搜索功能。这是一个通配符搜索,意味着用户可以输入任何内容,它将搜索数据库中的多个字段。
一个示例URL是testsite.com/Note/SearchNotes?searchquery=6/27
。我在数据库中的DateCreated
列中有一条值为6/27/2022 5:44:24 PM
的记录。
public ActionResult SearchNotes(string searchquery)
{
var test = db.Notes.Where(Note => Note.DateCreated.ToString().Contains(searchquery)
|| /* check more properties */).ToList(); //returns 0
}
我的问题是,当查询字符串(如"6/27"
(包含正斜杠时,它不会返回任何数据。像"27"
这样的字符串确实会返回数据。我相信/
是一个法律角色,所以我不明白为什么我会面临这个问题。
一个观察结果:它可能与ToString()
有关,因为正斜杠正在返回已经属于string
类型的属性的数据。
有人能解释一下这种行为的原因吗?还是更好的解决方案?
DateTime.TryParse(@"6/27/2022 5:44:24 PM", out var dateCreated);
var notes = new List<string>
{
@"testsite.com/Note/SearchNotes?searchquery=6/27"
, @"Some Other Data"
, @"someOtherNote containing 27..."
, dateCreated.ToString()
, dateCreated.ToString("yyyy/MM/dd")
, dateCreated.ToString("MM/dd/yyyy")
, dateCreated.ToString("MM/dd/yyyy", System.Globalization.CultureInfo.InvariantCulture)
};
Console.WriteLine("test1");
var test = notes.Where(note => note.Contains("27")).ToList();
foreach (var result in test)
Console.WriteLine(result);;
Console.WriteLine();
Console.WriteLine("test2");
var test2 = notes.Where(note => note.Contains("/27")).ToList();
foreach (var result in test2)
Console.WriteLine(result);
产生
test1
testsite.com/Note/SearchNotes?searchquery=6/27
someOtherNote containing 27...
2022-06-27 17:44:24
2022-06-27
06-27-2022
06/27/2022
test2
testsite.com/Note/SearchNotes?searchquery=6/27
06/27/2022
我认为这回答了你的问题。DateTime格式、区域性、机器和用户区域环境设置/本地化都是一门黑暗的艺术,为了确保通过字符串匹配找到日期(部分(,必须确保匹配格式。
注意,即使是显式格式";MM/dd/yyyy";产生格式化的输出";MM-dd-yyyy";直到我指定了CultureInfo.InvariantCulture