> System.NotSupportedException:“指定的类型成员'Date'不是
LINQ to Entities支持。只有初始化者,实体成员和 支持实体导航属性。“
我使用EntityFramework6从Sqlie查询,有一些关于dateTime的问题。
var test = DateTime.Now.Date;
var maxEntity=_baseService.GetList<TestNoMapping>(o => o.LastChangeTime.Date == test)
.OrderByDescending(o => o.SampleId)
.FirstOrDefault();
public class BaseService
{
private readonly BaseContext _baseContext = new BaseContext();
public List<T> GetList<T>(Expression<Func<T, bool>> where) where T : class
{
return _baseContext.Set<T>().Where(where).ToList();
}
我试过的DbFunctions.TruncateTime
,但它不起作用
答案 0 :(得分:1)
你可以做的最好的事情是通过范围测试来替换条件: 之间的最后午夜和今天的午夜:
var minDate = DateTime.Today;
var maxDate = minDate.AddDays(1);
var maxEntity = _baseService
.GetList<TestNoMapping>(o => o.LastChangeTime >= minDate
&& o.LastChangeTime < maxDate)
.OrderByDescending(o => o.SampleId)
.FirstOrDefault();
原因是在比较数据库值之前转换数据库值永远不是一个好主意:它会禁用列上的任何索引。 (见sargable)。
答案 1 :(得分:0)
您必须使用DbFunctions.TruncateTime
实体框架方法来匹配日期部分,因为Linq无法识别Date
属性。
您可以尝试以下代码吗?
var test = DateTime.Now;
var maxEntity=_baseService.GetList<TestNoMapping>(o => DbFunctions.TruncateTime(o.LastChangeTime.Date) == DbFunctions.TruncateTime(test))
.OrderByDescending(o => o.SampleId)
.FirstOrDefault();
答案 2 :(得分:0)
正如您在异常中看到的那样:LINQ to Entities
不支持Date
你应该使用
o => o.LastChangeTime.Year == test.Year &&
o.LastChangeTime.Month == test.Month &&
o.LastChangeTime.Day == test.Day &&
而不是
o => o.LastChangeTime.Date == test
修改强>
并改变
var test = DateTime.Now.Date;
到
var test = DateTime.Now;