搜索适用于除日期字段以外的所有字段
Search works on all fields except the date field
我想按日期搜索格式为 (dd/MM/yyyy) 的数据,例如“20/01/2021”。搜索适用于 ADDRESS 和 NAME 字段 ,但不适用于 CREATE_DATE.
的
这是我的代码:
// search
if (!string.IsNullOrEmpty(search))
{
List<string> terms = search.Split(',').ToList().ConvertAll(d => d.ToLower());
res = res.Where(x =>
terms.Any(
str => x.NAME.Contains(str) ||
x.ADDRESS.Contains(str) ||
x.DATE_CREATE.ToString().Contains(str)
));
var test = res.FirstOrDefault().DATE_CREATE.ToString();
}
这是请求:
http://localhost:6289/api/Customer?search=20/01/2021,hous
这是 terms 和 test var 的输出:
这就是日期的保存方式,它们的日期是日期时间类型
我认为将数据时间转换为日期 ToString() 您需要转换日期格式,如“dd/MM/yyyy”,这是您 url 中的参数 (search=20/01/2021) 然后在这里[x.DATE_CREATE.ToString().Contains(str)] 我会使用“等于”,就像 [x.DATE_CREATE.ToString("dd/MM/yyyy").equals(str)] 在查询中更具体.
您的代码实际上可以在我的机器上运行,但前提是我使用了@JustShadow 指出的适当的文化设置。
适当的文化:导致 datetime.ToString()
格式化日期 dd/MM/yyyy 格式。
出于测试目的,我在 if
语句中使用了“es-ES”文化,例如以下代码:
Thread.CurrentThread.CurrentCulture = new CultureInfo("es-ES");
我建议您根据此修改代码:
if (!string.IsNullOrEmpty(search))
{
List<string> terms = search.Split(',').ToList().ConvertAll(d => d.ToLower());
var originalCulture = Thread.CurrentThread.CurrentCulture;
try
{
// use any locale which results a datetime.ToString() output in dd/MM/yyyy format
Thread.CurrentThread.CurrentCulture = new CultureInfo("es-ES"); ;
res = res.Where(x =>
terms.Any(
str => x.NAME.Contains(str) ||
x.ADDRESS.Contains(str) ||
x.DATE_CREATE.ToString().Contains(str)));
var test = res.FirstOrDefault().DATE_CREATE.ToString();
}
finally
{
Thread.CurrentThread.CurrentCulture = originalCulture;
}
}
如果您的输入总是 dd/MM/yyyy 格式,这就足够了。
编辑:
您可以尝试在 ToString()
调用中使用自定义格式字符串来实现@bitapinches 建议的工作代码。我认为我的解决方案执行得更好,因为在 LINQ 将执行的每个比较中不需要解析自定义格式字符串。以下是可供参考的备选方案:
if (!string.IsNullOrEmpty(search))
{
List<string> terms = search.Split(',').ToList().ConvertAll(d => d.ToLower());
res = res.Where(x =>
terms.Any(
str => x.NAME.Contains(str) ||
x.ADDRESS.Contains(str) ||
x.DATE_CREATE.ToString(@"dd\/MM\/yyyy").Contains(str)));
var test = res.FirstOrDefault().DATE_CREATE.ToString();
}
我想按日期搜索格式为 (dd/MM/yyyy) 的数据,例如“20/01/2021”。搜索适用于 ADDRESS 和 NAME 字段 ,但不适用于 CREATE_DATE.
的这是我的代码:
// search
if (!string.IsNullOrEmpty(search))
{
List<string> terms = search.Split(',').ToList().ConvertAll(d => d.ToLower());
res = res.Where(x =>
terms.Any(
str => x.NAME.Contains(str) ||
x.ADDRESS.Contains(str) ||
x.DATE_CREATE.ToString().Contains(str)
));
var test = res.FirstOrDefault().DATE_CREATE.ToString();
}
这是请求:
http://localhost:6289/api/Customer?search=20/01/2021,hous
这是 terms 和 test var 的输出:
这就是日期的保存方式,它们的日期是日期时间类型
我认为将数据时间转换为日期 ToString() 您需要转换日期格式,如“dd/MM/yyyy”,这是您 url 中的参数 (search=20/01/2021) 然后在这里[x.DATE_CREATE.ToString().Contains(str)] 我会使用“等于”,就像 [x.DATE_CREATE.ToString("dd/MM/yyyy").equals(str)] 在查询中更具体.
您的代码实际上可以在我的机器上运行,但前提是我使用了@JustShadow 指出的适当的文化设置。
适当的文化:导致 datetime.ToString()
格式化日期 dd/MM/yyyy 格式。
出于测试目的,我在 if
语句中使用了“es-ES”文化,例如以下代码:
Thread.CurrentThread.CurrentCulture = new CultureInfo("es-ES");
我建议您根据此修改代码:
if (!string.IsNullOrEmpty(search))
{
List<string> terms = search.Split(',').ToList().ConvertAll(d => d.ToLower());
var originalCulture = Thread.CurrentThread.CurrentCulture;
try
{
// use any locale which results a datetime.ToString() output in dd/MM/yyyy format
Thread.CurrentThread.CurrentCulture = new CultureInfo("es-ES"); ;
res = res.Where(x =>
terms.Any(
str => x.NAME.Contains(str) ||
x.ADDRESS.Contains(str) ||
x.DATE_CREATE.ToString().Contains(str)));
var test = res.FirstOrDefault().DATE_CREATE.ToString();
}
finally
{
Thread.CurrentThread.CurrentCulture = originalCulture;
}
}
如果您的输入总是 dd/MM/yyyy 格式,这就足够了。
编辑:
您可以尝试在 ToString()
调用中使用自定义格式字符串来实现@bitapinches 建议的工作代码。我认为我的解决方案执行得更好,因为在 LINQ 将执行的每个比较中不需要解析自定义格式字符串。以下是可供参考的备选方案:
if (!string.IsNullOrEmpty(search))
{
List<string> terms = search.Split(',').ToList().ConvertAll(d => d.ToLower());
res = res.Where(x =>
terms.Any(
str => x.NAME.Contains(str) ||
x.ADDRESS.Contains(str) ||
x.DATE_CREATE.ToString(@"dd\/MM\/yyyy").Contains(str)));
var test = res.FirstOrDefault().DATE_CREATE.ToString();
}