我正在处理这行代码:

query = query.Where(p =>
  p.ChckNumber.ToString().Contains(globalSearch.ToString()) ||
  p.BankAccount.ToString().Contains(globalSearch.ToString()) ||
  p.Description.ToString().Contains(globalSearch.ToString()) ||
  p.CheckAmount.ToString().Contains(globalSearch) ||
  p.ClearedDate.ToString().Contains(globalSearch.ToString()) ||
  p.SentDate.ToString().Contains(globalSearch.ToString()));

有了这一行代码,我基本上在做一个搜索,当globalSearch是一个string并且像BankAccountDescription这样的列是varchar时,它似乎工作得很好,但是当globalSearch是一个IntDateTime(-2233或4/9/2013)时,对于CheckAmount (int)ClearedDate (DateTime)SentDate (DateTime),它返回0行,如果globalSearchint中的ChckNumber匹配,它就工作了!
我做错什么了?
我在SQL Server中运行了此查询:
SELECT CONVERT(VARCHAR(MAX), ClearedDate) FROM myTable
如果globalSearch是2017年9月10日,我的所有日期都会返回到2017年9月9日,但它不适用于我需要的格式:9/9/2017

最佳答案

您不应该关心globalsearch是否是int,因为您应该始终将其转换为字符串,除非是datetime;您不应该关心列是varchar还是int,因为您总是将列转换为字符串,除非是datetime。
注意,我假设,基于你的评论,你只是比较月份、日期和年份,并不关心cleareddate的时间
我发现你的代码有三个潜在的问题:
不能将globalsearch转换为列checkamount的字符串
在调用之前,不检查任何列的空值。toString,可能所有列都不允许空值。
你的代码可读性不强,很难让人看到不一致的地方。
下面是更可读的代码,它将globalsearch一次又一次转换为字符串,因为同样,您不会将globalsearch转换为checkamount的字符串:

var gsStr = globalSearch.ToString();
var gsDate = DateTime.MinDate;
if(globalSearch.GetType() == typeof(DateTime))
{
    gsDate = globalSearch;
}
query = query.Where(p => p.ChckNumber.ToString().Contains(gsStr)
|| p.BankAccount.ToString().Contains(gsStr)
|| p.Description.ToString().Contains(gsStr)
|| p.CheckAmount.ToString().Contains(gsStr)
|| p.ClearedDate.Date == gsDate.Date
|| p.SentDate.ToString().Contains(gsStr));

如果您使用的是C 6.0,则可以使用新的空传播运算符来防止在您的任何列现在或将来允许空时出错:
var gsStr = globalSearch.ToString();
var gsDate = DateTime.MinDate;
if(globalSearch.GetType() == typeof(DateTime))
{
    gsDate = globalSearch;
}
query = query.Where(p => p.ChckNumber?.ToString().Contains(gsStr)
|| p.BankAccount?.ToString().Contains(gsStr)
|| p.Description?.ToString().Contains(gsStr)
|| p.CheckAmount?.ToString().Contains(gsStr)
|| p.ClearedDate?.Date == gsDate.Date
|| p.SentDate?.ToString().Contains(gsStr));

将globalsearch转换为checkamount contains的string可能会解决您的问题,使您的代码更具可读性,并防止出现空值,如果它不修复bug,则调试会更容易。

10-02 01:25