我有一张桌子
public class CommandData
{
[PrimaryKey, AutoIncrement]
[Column("Id")]
public Guid Id { get; set; }
[Column("TimeStamp")]
public DateTime TimeStamp { get; set; }
}
但是,SQLite将DateTime
的{{3}}作为Unspecified
返回并视为本地;我不得不将表更改为始终返回UTC时间(我还尝试了DateTime.SpecifyKind(this.TimeStampStore,DateTimeKind.Utc),其中TimeStampStore的类型为DateTime ):
public class CommandData
{
[PrimaryKey, AutoIncrement]
[Column("Id")]
public Guid Id { get; set; }
[SQLite.Ignore]
public DateTime TimeStamp
{
get
{
return DateTime.Parse(this.TimeStampStore).ToUniversalTime();
}
set
{
TimeStampStore = value.ToUniversalTime().ToString("s") + "Z";
}
}
[Column("TimeStamp")]
public string TimeStampStore { get; set; }
}
这一改变突破了以下内容:
SQLite.SQLiteConnection.Table<CommandData>().OrderBy(x=>x.TimeStamp)
堆栈追踪:
at SQLite.TableQuery'1.AddOrderBy [U](Expression'1 orderExpr,Boolean asc)
在SQLite.TableQuery'1.OrderBy [U](Expression'1 orderExpr)
经过一番调查后,我发现System.NullReferenceException的原因是Table.FindColumnWithPropertyName(mem.Member.Name)
中SQLite.cs
上的点运算符
private TableQuery<T> AddOrderBy<U> (Expression<Func<T, U>> orderExpr, bool asc)
{
...
var q = Clone<T> ();
if (q._orderBys == null) {
q._orderBys = new List<Ordering> ();
}
q._orderBys.Add (new Ordering {
ColumnName = Table.FindColumnWithPropertyName(mem.Member.Name).Name,
Ascending = asc
});
return q;
}
public Column FindColumnWithPropertyName (string propertyName)
{
var exact = Columns.FirstOrDefault (c => c.PropertyName == propertyName);
return exact;
}
propertyName
是“TimeStamp”,但
Columns[].PropertyName
是“TimeStampStore”
Columns[].Name
是“TimeStamp”
,因此FindColumnWithPropertyName
会返回null
如果我更改SQLite.cs的AddOrderBy
函数:
Table.FindColumnWithPropertyName(mem.Member.Name).Name
到
Table.FindColumn(mem.Member.Name).Name
然后我的代码就可以了。
但我宁愿猜测我做错了,因为这段代码是由比我经验丰富的人编写的(特别是因为我找不到相关的帖子)
我的设置有问题吗?我可以完美地阅读和写作,但这一件事让我很头疼。
谢谢。
我实现了我的可能修复(更改函数AddOrderBy
),这解决了我的问题。
要使用Kind,我已移至SQLite.Net Extensions-PCL 1.3.0,这会产生完全相同的问题;
在SQLite.Net.TableQuery1.AddOrderBy [TValue](Expression1 orderExpr,Boolean asc)
在SQLite.Net.TableQuery1.OrderBy [TValue](Expression1 orderExpr)
但是现在我无法应用我以前的修复,因为我不再使用.cs文件(现在是.dll)。
有什么想法吗?