NullReferenceException 在连接字符串 属性 上使用 Where 查询 SQLite 数据库
NullReferenceException Query SQLite database with Where on a concatenated string property
我正在尝试 select 使用以下代码记录:
Location item = connection
.Table<Location>()
.Where(l => l.Label.Equals(label))
.FirstOrDefault();
这导致:
System.NullReferenceException: Object reference not set to an instance of an object.
当我在不同的 属性(邮政编码)尝试相同的操作时,即使没有找到任何记录,它也能正常工作。:
Location item = connection
.Table<Location>()
.Where(l => l.Postcode.Equals(label))
.FirstOrDefault();
这是位置 Class:
// These are the Locations where the Stock Take Sessions are done
public class Location : DomainModels, IComparable<Location>
{
[JsonProperty("id"), PrimaryKey]
public int Id { get; set; }
public string Name { get; set; }
public string Street { get; set; }
public int Number { get; set; }
public string Postcode { get; set; }
public string City { get; set; }
public bool Completed { get; set; }
[Ignore] // Removing this does not have an impact on the NullReferenceException
public string Label => $"{Name ?? ""} - ({Postcode ?? ""})";
public int CompareTo(Location other)
{
return Name.CompareTo(other.Name);
}
// Navigation property
// One to many relationship with StockItems
[OneToMany(CascadeOperations = CascadeOperation.All), Ignore]
public List<StockItem> StockItems { get; set; }
// Specify the foreign key to StockTakeSession
[ForeignKey(typeof(StockTakeSession))]
public int StockTakeSessionId { get; set; }
// One to one relationship with StockTakeSession
[OneToOne]
public StockTakeSession StockTakeSession { get; set; }
}
我做错了什么?
感谢任何建议!
您在 数据存储区 上 Label
但 您在 class 上的标记 Location
用 IgnoreAttribute
装饰了 Label
属性。这意味着 Label
属性 将不会被设置,直到 在 实体被具体化到内存并且你不能在数据存储中对它做任何事情。
.Where(l => l.Label.Equals(label))
修复
有一些选项。
- 您可以将其设置为计算列,并使用相同的逻辑在商店中创建一个计算列。这涉及直接在 RDBMS 管理器中手动更改 table 架构或编辑迁移脚本。 属性 被标记为
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
( 如果使用属性,上面的代码是 )。
- 您可以更改
Where
以过滤在商店中找到的构成 Label
的属性。即:.Where(l => l.Postcode.Equals(Postcode) && l.Name.Equals(Name))
您可以将该特定过滤器之前的所有内容具体化到内存中,然后应用该过滤器。 如果之前的一切都导致大量记录,则不推荐这样做。例如,使用下面的代码,如果 table 很大,您将检索单个记录的所有内容。
Location item = connection
.Table<Location>()
.AsEnumerable()
.Where(l => l.Label.Equals(label))
.FirstOrDefault();
编辑
[Ignore] // Removing this does not have an impact on the NullReferenceException
不,它不应该,除非您将具有相同名称的列添加到现有模式并且用所有数据填充它。 (或在您的架构中创建同名的计算列)
我正在尝试 select 使用以下代码记录:
Location item = connection
.Table<Location>()
.Where(l => l.Label.Equals(label))
.FirstOrDefault();
这导致:
System.NullReferenceException: Object reference not set to an instance of an object.
当我在不同的 属性(邮政编码)尝试相同的操作时,即使没有找到任何记录,它也能正常工作。:
Location item = connection
.Table<Location>()
.Where(l => l.Postcode.Equals(label))
.FirstOrDefault();
这是位置 Class:
// These are the Locations where the Stock Take Sessions are done
public class Location : DomainModels, IComparable<Location>
{
[JsonProperty("id"), PrimaryKey]
public int Id { get; set; }
public string Name { get; set; }
public string Street { get; set; }
public int Number { get; set; }
public string Postcode { get; set; }
public string City { get; set; }
public bool Completed { get; set; }
[Ignore] // Removing this does not have an impact on the NullReferenceException
public string Label => $"{Name ?? ""} - ({Postcode ?? ""})";
public int CompareTo(Location other)
{
return Name.CompareTo(other.Name);
}
// Navigation property
// One to many relationship with StockItems
[OneToMany(CascadeOperations = CascadeOperation.All), Ignore]
public List<StockItem> StockItems { get; set; }
// Specify the foreign key to StockTakeSession
[ForeignKey(typeof(StockTakeSession))]
public int StockTakeSessionId { get; set; }
// One to one relationship with StockTakeSession
[OneToOne]
public StockTakeSession StockTakeSession { get; set; }
}
我做错了什么?
感谢任何建议!
您在 数据存储区 上 Label
但 您在 class 上的标记 Location
用 IgnoreAttribute
装饰了 Label
属性。这意味着 Label
属性 将不会被设置,直到 在 实体被具体化到内存并且你不能在数据存储中对它做任何事情。
.Where(l => l.Label.Equals(label))
修复
有一些选项。
- 您可以将其设置为计算列,并使用相同的逻辑在商店中创建一个计算列。这涉及直接在 RDBMS 管理器中手动更改 table 架构或编辑迁移脚本。 属性 被标记为
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
( 如果使用属性,上面的代码是 )。 - 您可以更改
Where
以过滤在商店中找到的构成Label
的属性。即:.Where(l => l.Postcode.Equals(Postcode) && l.Name.Equals(Name))
您可以将该特定过滤器之前的所有内容具体化到内存中,然后应用该过滤器。 如果之前的一切都导致大量记录,则不推荐这样做。例如,使用下面的代码,如果 table 很大,您将检索单个记录的所有内容。
Location item = connection .Table<Location>() .AsEnumerable() .Where(l => l.Label.Equals(label)) .FirstOrDefault();
编辑
[Ignore] // Removing this does not have an impact on the NullReferenceException
不,它不应该,除非您将具有相同名称的列添加到现有模式并且用所有数据填充它。 (或在您的架构中创建同名的计算列)