C# SQLite.Net OrderBy函数返回空引用异常 站台: Windows 8.1通用 之前请参见下面的编辑 当前 工作
我有一张桌子C# SQLite.Net OrderBy函数返回空引用异常 站台: Windows 8.1通用 之前请参见下面的编辑 当前 工作,c#,sqlite,sqlite-net,sqlite-net-extensions,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将日期时间返回为未指定,并将其视为本地;我必须将表更改为始终返回UTC时间(我还尝试了Dat
public class CommandData
{
[PrimaryKey, AutoIncrement]
[Column("Id")]
public Guid Id { get; set; }
[Column("TimeStamp")]
public DateTime TimeStamp { get; set; }
}
零钱
但是,SQLite将日期时间
返回为未指定
,并将其视为本地;我必须将表更改为始终返回UTC时间(我还尝试了DateTime.SpecifyKind(this.TimeStampStore,DateTimeKind.UTC),其中TimeStampStore的类型为DateTime):
这一变化打破了以下局面:
SQLite.SQLiteConnection.Table<CommandData>().OrderBy(x=>x.TimeStamp)
propertyName
是“时间戳”,但是
列[]。PropertyName
是“时间戳存储”
列[]。名称
为“时间戳”
因此,FindColumnWithPropertyName
返回一个null
可能的修复
如果我更改SQLite.cs的AddOrderBy
函数:
Table.FindColumnWithPropertyName(mem.Member.Name).Name
到
然后我的代码工作
但我宁愿猜测我做错了什么,因为这段代码是由比我更有经验的人编写的(特别是因为我找不到相关的帖子)
问题:
我的设置有问题吗?我读写都很好,但这件事让我很头疼
多谢各位
编辑
我实施了可能的修复(更改函数AddOrderBy
),解决了我的问题
使用我移动到的,它产生了完全相同的问题
在SQLite.Net.TableQuery1.AddOrderBy[TValue](表达式1 orderExpr,布尔asc)
在SQLite.Net.TableQuery1.OrderBy[TValue](表达式1 orderExpr)
但现在我无法应用以前的修复程序,因为我不再提供.cs文件(现在是.dll)
有什么想法吗?可能是我,但我不太确定你想达到什么目的。你能详细说明一下吗?@Barptad应用程序非常简单:从数据库中获取按时间戳排序的项目。有多种方法可以做到这一点;最简单的方法可能是将它们读出到实现
IEnumerable
接口的任何东西,然后使用Linq来OrderBy
它们。然而,应用程序不是问题所在,而是我的SQLite实现不起作用。我遇到过类似的SQLite和DateTime问题。正如您刚才所说,我最终进行了一个查询来选择对象,然后对结果使用Linq执行OrderBy。虽然现在可能有点晚了,但我发现当我必须处理SQLite时,SQLiteNetExtensions Nuget包非常有用。它基于slite net,可以非常方便地设置关系和执行大多数标准操作。这可以帮助其他到达这里的人,我在使用.OrderBy(x=>x.Y)时遇到了这个问题,其中Y是有效属性,但标记为[Ignore],因此它不是有效列。
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;
}
Table.FindColumnWithPropertyName(mem.Member.Name).Name
Table.FindColumn(mem.Member.Name).Name