平台:
- Windows 8.1 通用
- sqlite-net 1.0.8 以前请参阅下面的编辑
- SQLite.Net PCL 3.1.1 当前
在职的
我有一张桌子
public class CommandData
{
[PrimaryKey, AutoIncrement]
[Column("Id")]
public Guid Id { get; set; }
[Column("TimeStamp")]
public DateTime TimeStamp { get; set; }
}
突破性变化
但是,SQLite 返回DateTime
's Kind asUnspecified
并被视为 Local;我不得不更改表格以始终返回 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)
堆栈跟踪:
在 SQLite.TableQuery'1.AddOrderBy[U](Expression'1 orderExpr, Boolean asc)
在 SQLite.TableQuery'1.OrderBy[U](Expression'1 orderExpr)
原因
经过一番调查,我发现 System.NullReferenceException 的原因是 in 上的点运算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
时间戳”,但是
Columns[].PropertyName
是“时间戳商店”
Columns[].Name
是“时间戳”
并因此FindColumnWithPropertyName
返回一个null
可能的修复
如果我更改 SQLite.cs 的AddOrderBy
功能:
Table.FindColumnWithPropertyName(mem.Member.Name).Name
至
Table.FindColumn(mem.Member.Name).Name
然后我的代码有效。
但我宁愿猜测我做错了什么,因为这段代码是由比我更有经验的人编写的(特别是因为我找不到相关的帖子)
问题
我的设置有问题吗?我可以完美地读写,但这件事让我很头疼。
谢谢你。
编辑
我实施了可能的修复(更改功能AddOrderBy
),解决了我的问题。
要使用SQLite.Net Extensions-PCL 1.3.0,我移至SQLite.Net PCL 3.1.1,它产生了完全相同的问题;
在 SQLite.Net.TableQuery1.AddOrderBy[TValue](Expression1 orderExpr, Boolean asc)
在 SQLite.Net.TableQuery1.OrderBy[TValue](Expression1 orderExpr)
但现在我无法应用我之前的修复,因为我不再看到 .cs 文件(现在是 .dll)。
有任何想法吗?