LINQ to Entities不支持指定的类型成员'Date'。(使用Sqlie)

时间:2017-07-27 07:50:54

标签: c# sqlite datetime entity-framework-6

enter image description here> 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,但它不起作用

3 个答案:

答案 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;