xamarin 获取错误:日期比较时系统不支持异常

pkwftd7m  于 2022-12-07  发布在  其他
关注(0)|答案(3)|浏览(146)

因此,我尝试在UserDatabase.cs类中使用以下方法检索特定日期的“Sugar”类的示例:

public List<Sugar> GetSugarDate(DateTime dt)  
{  
    var bld = database.Table<Sugar>().Where(mi => mi.Time.Date == dt.Date).ToList();  
    return bld;  
}
  • 请记住,应用程序目前没有任何Sugar示例,因此日期比较是在空值和实际日期之间进行的。我认为这是导致错误的原因,任何解决方案都将受到赞赏。

在另一个类中,对此方法的调用如下所示:

DateTime Time = DateTime.Now;

ObservableCollection<Image> Sugar_Count = new ObservableCollection<Image>();
Image s = new Image();
s.Source = "drawable/soda.png";
var xa = App.Database.GetSugarDate(Time);

Sugar.cs类定义如下:

public class Sugar
{
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }
    public DateTime Time { get; set; }
    public int DrinkCount { get; set; }

    public Sugar()
    {
        Time = DateTime.Now;
        DrinkCount = 0;
    }
}

现在得到的错误是:
System.NotSupportedException:成员访问未能编译SQLite上的表达式。TableQuery '1 [T]。CompileExpr(系统.链接.表达式.表达式表达式,系统.集合.泛型.列表' 1 [T]queryArgs)[0x 006 cc]位于<9b4aaa861238418bec74a2ddde70f09>:0上的SQLite。TableQuery '1 [T]。CompileExpr(系统.链接.表达式.表达式表达式,系统.集合.泛型.列表' 1 [T]queryArgs)[0x 0009 d]位于<9b4aaa861238418bec74a2ddde70f09>:0上的SQLite. TableQuery '1 [T].CompileExpr(系统.链接.表达式.表达式表达式,系统.集合.泛型.列表'1 [T]queryArgs)[0x 0005 f]in<9b4aaa861238418bec74a2ddde70f09>:0 at SQLite. TableQuery' 1 [T].CompileExpr(系统.链接.表达式.表达式表达式,系统.集合.泛型.列表'1 [T]queryArgs)[0x 00008]in<9b4aaa861238418bec74a2ddde70f09>:0 at系统.集合.泛型.列表' 1 [T].. ctor(系统.集合.泛型. IEnumerable '1 [T]集合)[0x 00062]位于/用户/构建器/jenkins/工作区/xamarin-android/外部/mono/mcs/类/引用源/泛型/列表.cs:98.....
错误发生在以下特定行:

var bld = database.Table<Sugar>().Where(mi => mi.Time.Date == dt.Date).ToList();

我哪里做错了?

pepwfjgg

pepwfjgg1#

表达式的这一部分无法转换为SQL。

mi => mi.Time.Date

您可以尝试使用:

var bld = database.Table<Sugar>().ToList().Where(mi => mi.Time.Date == dt.Date).ToList();

访问DateTime列(mi.Time.Date)的Date部分无法使用Linq转换为SQL,因此,您的语句最初失败。因此,使用ToList获取内存中的所有记录,允许我们使用Linq to Object方法而不是Linq to SQLite进行查询。

kse8i1jr

kse8i1jr2#

这是一个小janky,但我有这个工作:

public List<Sugar> GetSugarDate(DateTime dt)
{
    var dayStart = dt.Date.AddDays(-1);
    var dayEnd = dt.Date.AddDays(1);

    var bld = database.Table<Sugar>().Where(mi => mi.Time > dayStart && mi.Time < dayEnd).ToList();
    return bld;
}

此外,请确保使用以下命令初始化数据库连接:

SQLiteConnection database = new SQLiteConnection(_path,false);

如果要查询可为null的DateTime

44u64gxh

44u64gxh3#

那个小混蛋的代码对我有用

var dayStart = stockDate.Date.AddDays(-1);
var dayEnd = stockDate.Date.AddDays(1);

return  db.Table<ProductStock>().Where(x => x.StockDate > dayStart && x.StockDate < dayEnd).ToListAsync();

相关问题