SQLite.Net OrderBy函数返回Null引用异常

时间:2016-03-08 08:35:26

标签: c# sqlite sqlite-net sqlite-net-extensions

平台:

工作

我有一张桌子

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

有什么想法吗?

0 个答案:

没有答案