2015-07-10 64 views
15

我想从SQLite中拉出最近的DateTime字段,它返回的时间不正确。LINQ to SQL查询不返回正确DateTime

这里的数据库中的数据:

enter image description here

这里是我的方法通过LINQ来获得最新的日期时间:

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(); 
     } 
    } 

的问题是,它没有返回预期约会时间。我得到1/1/0001上午12点:

enter image description here

我在做什么错?

编辑:这是正在使用的提供者,每个请求:https://components.xamarin.com/view/sqlite-net

编辑2:请求SyncAudit类别:

class SyncAudit 
{ 
    public string Server { get; set; } 
    public string Database { get; set; } 
    public DateTime SyncTime { get; set; } 
    public int Successful { get; set; } 
} 
+0

你的标题说 “的LINQ to SQL” - 我想的LINQ to SQL只与SQL Server合作...你实际使用的LINQ提供者是什么? –

+0

你是否有任何与syntime作为空行,因为值来的是默认datetime.min值 – Sachu

+1

它看起来像不正确的表或连接字符串。它找不到任何记录并返回默认值。尝试第一个,而不是FirstOrDefault,看看你是否得到像序列一样的错误不包含元素或类似的东西.. –

回答

1

变化

公共的DateTime同步时间{获得;组; }

到:

公众的DateTime? synctime {get;组; }

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

+0

这会导致getLastSyncTime()方法中出现编译错误。 IT表示现在还没有SyncTime的定义。 –

+0

@DavidTunnel在表中该列可能处于非空模式 – Sachu

+0

请问您能表明一下你的意思吗? –

-1

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

因此,也许SyncTime作为文本而不是数字存储在您的数据库中。试着调整连接,以便提供商可以通过interpret data correctly传递falsestoreDateTimeAsTicks

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

要诊断的问题是什么,回到基础。将LINQ更改为foreach循环以迭代所有记录,并找到最大值。现在单步执行代码(因为我怀疑它不会做你期望的),你会发现什么地方出了问题。然后告诉我们什么是错的。

1

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

db.Table<SyncAudit>() 

是一个空集,当你选择

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

自然会回报你的日期时间的默认值。 检查您的数据库连接并确保它首先工作。

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(); 
    }