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 上的标记 LocationIgnoreAttribute 装饰了 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

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