使用SQLite与EF6

时间:2015-10-15 01:03:01

标签: c# entity-framework linq sqlite datetime

我正在尝试使用Linq与SQLite数据库上的实体进行比较。以下代码有效,但我需要修剪时间部分以获得正确的结果。

return (from c in Context.Car
        join d in Context.Driver on c.CarID equals d.DriverID
        join r in Context.Rides on c.CarID equals r.RideID into rideJoin
        from rides in rideJoin.DefaultIfEmpty()
        where c.IsActive && d.IsActive 
        group rides by new { c.CarID, d.FullName, d.HireDate, d.FirstPayRiseDate } into grp
        select new MyCustomClass
        {
            CarID = grp.Key.CarID,
            Driver = grp.Key.FullName,
            NumberOfRides = grp.Count(x => x != null && x.RideDate >= grp.Key.HireDate && x.RideDate <= grp.Key.FirstPayRiseDate)
        }).OrderBy(x => x.Driver ).ToList();

我尝试使用System.Data.Entity.DBFunctions就是这样,我收到了这个错误:

NumberOfRides = grp.Count(x => x != null && DbFunctions.TruncateTime(x.RideDate) >= grp.Key.HireDate && DbFunctions.TruncateTime(x.RideDate) <= grp.Key.FirstPayRiseDate)
  

SQL逻辑错误或缺少数据库没有这样的功能:TruncateTime

我也在DBFunctions.DiffDays()

中得到了同样的错误

我也试过像这样投射到日期并得到这个错误:

NumberOfRides = grp.Count(x => x != null && x.RideDate.Date >= grp.Key.HireDate && x.RideDate.Date <= grp.Key.FirstPayRiseDate)
  LINQ to Entities不支持

'Date'。仅支持初始化程序,实体成员和实体导航属性

是什么给出的?我怎么能在Linq中使用SQLite实现Date函数?

2 个答案:

答案 0 :(得分:1)

  

我需要修剪时间部分以获得正确的结果

不,不。如果您想要包含startDateendDate之间的行,请使用

... && x.RideDate >= startDate && x.RideDate < endDate.AddDays(1)

(请注意,第二次比较现在“严格小于”。)

答案 1 :(得分:0)

您如何在数据库中存储日期?作为unix时间积分器? 在该程序中,您可以修改您的连接字符串以包含以下配置设置,这样可以通过EF轻松读取日期时间值。

datetimeformat = UnixEpoch; datetimekind = UTC

类似于:

data source=&quot;|DataDirectory|\data.sqlite&quot;;datetimeformat=UnixEpoch;datetimekind=Utc

参考:https://stackoverflow.com/a/24323591/3660930