3

平台:

在职的

我有一张桌子

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)。

有任何想法吗?

4

0 回答 0