这几天使用Linq to EF 出现以下几个bug,记录下来
问题一:Linq to EF求两个时间段的列表记录
错误提示:
LINQ to Entities does not recognize the method ‘System.DateTime
ToDateTime(System.String)’ method, and this method cannot be
translated into a store expression. LINQ to Entities
不识别方法“System.DateTime ToDateTime(System.String)”,因此该方法无法转换为存储表达式。
代码:
lst = lst.Where(a =>
Convert.ToDateTime(a.returnDate) >= beginDate &&
Convert.ToDateTime(a.returnDate) <= endDate);
原因分析:
因为在数据库中 a.returnDate 字段是string,beginDate是Datetime类型,在使用Convert.ToDateTime 解析出现错误,而字段类型又不能更改,在将beginDate转换成string,然後使用String的静态方法.Compare顺利解决。
解决方法如下:
lst= lst.Where(d => String.Compare(d.returnDate, beginDate)>=0
&&String.Compare( d.returnDate, endDate)<=0);
具体资料可参照这个链接深入谈谈 C# 的 String.CompareTo
问题二:时间类型不规范
后台传送过来的参数是这样的形式:
“/Date(1405056837780)/”
需要转化为这种形式:
2018-07-10
js的代码如下:
//往往json传过来的时间都是"/Date(1405056837780)/"
//转换需要的方法
String.prototype.ToString = function (format) {
var dateTime = new Date(parseInt(this.substring(6, this.length - 2)));
format = format.replace("yyyy", dateTime.getFullYear());
format = format.replace("yy", dateTime.getFullYear().toString().substr(2));
format = format.replace("MM", dateTime.getMonth() + 1)
format = format.replace("dd", dateTime.getDate());
format = format.replace("hh", dateTime.getHours());
format = format.replace("mm", dateTime.getMinutes());
format = format.replace("ss", dateTime.getSeconds());
format = format.replace("ms", dateTime.getMilliseconds())
return format;
};
//调用,可重载
"/Date(1405056837780)/".ToString("yyyy年MM月dd日hh时mm分ss秒");
"/Date(1405056837780)/".ToString("yyyy-MM-dd");
问题三:url传参
ASP.NET MVC3 通过Url传多个参数方法具体可以参照这篇文章
问题四:Linq to EF string 转 DateTime
LINQ TO EF 对于string转DateTime无法使用ConvertToDateTime的解决办法:
- 引入SqlFunctions,也就是增加using System.Data.Entity.SqlServer;
- 由于SqlFunctions并没有Convert函数,所以使SqlFunctions.DateAdd(“Day”,0,t.workdate)变通的实现下,顾名思义,就是在类型为Day的值上加0,也就是不加天数,那就是t.workdate当天了。t.workdate在数据库里是nvarchar类型的,在domain里是string类型