NullReferenceException使用连接字符串属性上的Where查询SQLite数据库

时间:2017-09-22 10:20:17

标签: c# android sqlite-net-extensions

我尝试使用以下代码选择记录:

Location item = connection
  .Table<Location>()
  .Where(l => l.Label.Equals(label))
  .FirstOrDefault();

这导致:

  

System.NullReferenceException:对象引用未设置为对象的实例。

当我尝试相同的时候,在不同的属性(邮政编码)上,当没有找到记录时,一切正常。:

Location item = connection
  .Table<Location>()
  .Where(l => l.Postcode.Equals(label))
  .FirstOrDefault();

这是位置类:

// 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; }

}

我做错了什么?

感谢您的任何建议!

1 个答案:

答案 0 :(得分:5)

Label 上的数据存储过滤,但您的班级Location上的标记已修饰了Label属性与IgnoreAttribute。这意味着{<1}}属性将不会设置,直到 实体已实现到内存后,您才能在数据存储中对其执行任何操作。

Label

修复

有一些选择。

  • 您可以将其设置为计算并使用相同的逻辑在商店中创建计算列。这涉及直接在RDBMS管理器中手动更改表模式或编辑迁移脚本。该属性标有.Where(l => l.Label.Equals(label)) ,如果使用属性,上面的代码是)。
  • 您可以更改[DatabaseGenerated(DatabaseGeneratedOption.Computed)]以过滤在商店中找到的构成Where的属性。即:Label
  • 您可以在该特定过滤器之前实现所有内容,然后应用过滤器。如果这一切到目前为止导致大量记录,则不推荐。例如,如果表格很大,则使用下面的代码,您将检索单个记录的所有内容。

    .Where(l => l.Postcode.Equals(Postcode) && l.Name.Equals(Name))

修改

  

[忽略] //删除它不会对NullReferenceException产生影响

不,除非您通过并将相同名称的列添加到现有架构中,否则不应该使用所有数据填充它。 (或在模式中使用相同名称创建计算列