【福分系统】 LINQ to Entities 不识别方法“System.DateTime ToDateTime(System.String)”,因此该方法无法转换为存储表达式。


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)举一反三,将解决方案拓展到同类问题。

猜你喜欢

转载自blog.csdn.net/LJL55555/article/details/78155973