LINQ to SQL查询未返回正确的DateTime

时间:2015-07-10 15:33:22

标签: c# linq sqlite datetime

我试图从SQLite中提取最新的DateTime字段,并返回错误的时间。

数据库中的数据:

enter image description here

这是我通过LINQ获取最新DateTime的方法:

test.out();

问题是它没有返回预期的日期时间。我正在上午12点1分获得:

enter image description here

我做错了什么?

编辑:这是根据请求使用的提供商:https://components.xamarin.com/view/sqlite-net

编辑2:请求的SyncAudit类:

    public string getLastSyncTime()
    {
        using (var db = new SQLite.SQLiteConnection(this.DBPath))
        {
            var query = db.Table<SyncAudit>()
                       .OrderByDescending(c => c.SyncTime)
                       .Select(c => c.SyncTime)
                       .FirstOrDefault();

          return query.ToString();
        }
    }

5 个答案:

答案 0 :(得分:1)

更改

  

public DateTime synctime {get;组; }

为:

  

公共日期时间? synctime {get;组; }

希望它会有所帮助。会发生什么是DateTime是非NULL数据类型,它强制在那里放置一个默认值(01/01/0001)以确保提交非空日期。不知道它是否是一个问题。 .try并检查

答案 1 :(得分:1)

当这个结果发生时,我查看了所有可能的情况。您的问题只有一个合理的解释。你的

db.Table<SyncAudit>()

是一个空集合,当您选择

db.Table<SyncAudit>()
                   .OrderByDescending(c => c.SyncTime)
                   .Select(c => c.SyncTime)
                   .FirstOrDefault();

它会自然地返回DateTime的默认值。 检查数据库连接并确保它首先工作。

答案 2 :(得分:0)

要诊断出问题所在,请返回基础知识。将LINQ更改为foreach循环以迭代所有记录,并找到最大值。现在逐步完成代码(因为我怀疑它不会做你想要的)并且你会看到出了什么问题。然后告诉我们出了什么问题。

答案 3 :(得分:0)

我经常使用SelectSQLite一起使用此问题。我不知道问题究竟在哪里,但似乎延迟加载被破坏,所以当评估查询时,你最终得到默认值。我通过在Select之前强制进行评估来解决这个问题。这很烦人,但它确实有效:

破碎的例子(我自己的):

        using (var db = new SQLiteConnectionWithLock(base.DatabasePath))
        {
            return db.Table<VideoUploadChunk>()
                .Where(c => c.VideoId == videoId)
                .Select(c => c.ChunkNumber)
                .ToList();
        }

这应返回ints的列表,但最终会返回一堆0(默认值)。

修复示例:

        using (var db = new SQLiteConnectionWithLock(base.DatabasePath))
        {
            var result = db.Table<VideoUploadChunk>()
                .Where(c => c.VideoId == videoId)
                .ToList();

            return result.Select(c => c.ChunkNumber);
        }

你的例子(希望修复):

    using (var db = new SQLite.SQLiteConnection(this.DBPath))
    {
        var query = db.Table<SyncAudit>()
                   .OrderByDescending(c => c.SyncTime)
                   .FirstOrDefault();

        return query.Select(c => c.SyncTime).ToString();
    }

答案 4 :(得分:-1)

SQLite don't have special type for date and time,而是使用数字或文本来存储此类数据。 SQLiteConnection构造函数有一个参数storeDateTimeAsTicks,告诉您的提供商应该如何插入并存储日期和时间值。这是默认的。

所以也许SyncTime作为文本而不是数字存储在数据库中。尝试通过将false作为storeDateTimeAsTicks传递来调整连接,以便提供商可以interpret data correctly

var db = new SQLite.SQLiteConnection(this.DBPath, storeDateTimeAsTicks: false)