如何在C# SQLite(MAUI项目)中按指定日期读取记录?
解决MAUI中SQLite按日期查询记录的错误问题
错误原因
你遇到的SQLite.SQLiteException: 'no such function: toshortdatestring'错误,本质是SQLite-net会把Linq表达式转换成SQL语句执行,但C#的日期格式化方法(如ToShortDateString()、ToString())以及Entity Framework的SqlFunctions都不是SQLite原生支持的函数,SQLite无法识别这些调用,因此报错。
可行解决方案
方案1:利用SQLite的日期截断功能(简洁写法)
SQLite-net支持将DateTime.Date属性转换为SQLite的DATE()函数调用,直接比较日期部分即可:
var targetDate = dt.Date; List<Statistic> rsl = await Database.Table<Statistic>() .Where(s => s.ScreenDate.Date == targetDate) .ToListAsync();
方案2:查询时间范围(性能更优,适合带索引的场景)
通过计算目标日期的当天起始和结束时间,用范围查询匹配记录,这种方式可以利用ScreenDate字段的索引,查询效率更高:
// 目标日期的0点整 var startOfDay = dt.Date; // 目标日期的第二天0点整(作为范围的结束边界) var endOfDay = startOfDay.AddDays(1); List<Statistic> rsl = await Database.Table<Statistic>() .Where(s => s.ScreenDate >= startOfDay && s.ScreenDate < endOfDay) .ToListAsync();
为什么之前的尝试失败
- 调用C#的
ToShortDateString():SQLite没有对应的SQL函数,Linq转换后的SQL语句包含不存在的函数名,直接报错。 - 使用
System.Data.Entity.SqlServer.SqlFunctions:这个类是为Entity Framework适配SQL Server设计的,SQLite-net不兼容这些函数,因此无法转换为有效的SQL语句。
内容的提问来源于stack exchange,提问作者Enrico
相关产品推荐
相关产品推荐

