1. 需求:
查询某一时间段内的记录:数据库中字段“date”的类型是varchar,前台传入的参数类型是string。
2. 产生该问题的代码:
3. 出错原因:
Convert.ToDateTime(r.date)不能被解析成Sql语句(linq语句用来查询数据,但不能转换数据类型)。
4. 解决思路:
现在需要解决的问题是:用string类型的两个日期,查询处在数据库varchar类型字段之间的记录。毫无疑问,我们需要做的就是将字符串类型转换为日期类型,然后进行比较。
(1)在linq语句中先转类型再比较(linq语句中无法转类型,不可行)
(2)使用linq语句之前,用变量保存转完类型之后的内容(没做出来)
(3)先将需要的内容查出来保存到泛型,然后在viewmodel定义一个日期类型的字段,用来存放转换类型的数据,最后利用第一次查询的成果,将起始日期作为参数传入,进行最终的查询。
5. 代码
public List<ViewModel.addMcoinRecordViewModel> FuzzySearchByDate(string userName, string date,string dateEnd)
{
excellentmcoinEntities DBcontext = new excellentmcoinEntities();
List<ViewModel.addMcoinRecordViewModel> addmcoinList = new List<ViewModel.addMcoinRecordViewModel>();
List<ViewModel.addMcoinRecordViewModel> dateList = new List<ViewModel.addMcoinRecordViewModel>();
DateTime start = DateTime.Parse(date);
DateTime end = DateTime.Parse(dateEnd);
//查询与姓名相关的所有记录
dateList = (from r in dbcontext.t_addmcoinrecord
join u in dbcontext.t_user on r.userID equals u.userID
join t in dbcontext.t_type on r.typeID equals t.type_ID
where u.userName.Contains(userName)
orderby r.date descending
select new ViewModel.addMcoinRecordViewModel
{
addMcoin = r.addMcoin,
type = t.type_Name,
userName = u.userName,
date = r.date
}
).ToList();
//将日期字段的所有值由字符串类型转换为日期类型
foreach (var item in dateList)
{
item.datetime = Convert.ToDateTime(item.date);
}
//利用获得的泛型,将起始时间作为参数传入,进行查询
addmcoinList = (from list in dateList
where (list.datetime>= start && list.datetime <= end )
orderby list.date descending
select list).ToList<addMcoinRecordViewModel>();
return addmcoinList;
}
小结
本次解决问题采用的是曲线“救国”,当然主要原因是“直线救国”没成功。通过这个过程,我们从中可以学到很多东西。对我而言,很有感触的一点是如何解决问题,下面是我的一点见解:
(1)解决问题,无关方法
(2)使用更有效的方法解决问题
(3)将多种解决方案进行对比,比较异同与优缺点
(4)举一反三,将解决方案拓展到同类问题。