【问题标题】:UWP SQLite query result class contains another classUWP SQLite 查询结果类包含另一个类
【发布时间】:2016-05-10 23:49:05
【问题描述】:

我知道我们可以进行多表查询,如下所示:

using (var db = new SQLiteConnection(new SQLitePlatformWinRT(), App.DB_PATH))
{
    var result = db.Query<PersonWithAddress>(
        @"SELECT Person.Id, Person.Name, Person.Surname, 
            Address.Street, Address.City, Address.Country
        FROM Person INNER JOIN Address ON Person.AddressId = Address.Id;");
}

private class PersonWithAddress
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Surname { get; set; }
    public string Street { get; set; }
    public string City { get; set; }
    public string Country { get; set; }
}

*来自Query multiple tables SQLite Windows 10 UWP的引用

但是我需要的结果类 PersonWithAddress 应该是:

private class PersonWithAddress
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Surname { get; set; }
    public Address mAddress { get; set}
}

private class Address {
    public string Street { get; set; }
    public string City { get; set; }
    public string Country { get; set; }
}

我正在寻找一种 DataReader 的方式,但 UWP 上的 SQLite 似乎不支持它。

【问题讨论】:

  • 链接的问题还提到了 SQLite-Net.Extensions。你试过了吗?

标签: c# sqlite uwp sqlite-net


【解决方案1】:

这是一个Portable Class Library for SQLite,它提供类似于 DataReader 的方法。

要使用这个库,我们可以从NuGet 安装它,然后像下面这样使用它:

List<PersonWithAddress> PersonWithAddressList = new List<PersonWithAddress>();

using (var connection = new SQLitePCL.SQLiteConnection(DB_PATH))
{
    using (var statement = connection.Prepare(@"SELECT Person.Id, Person.Name, Person.Surname, Address.Street, Address.City, Address.Country FROM Person INNER JOIN Address ON Person.AddressId = Address.Id;"))
    {
        while (statement.Step() == SQLitePCL.SQLiteResult.ROW)
        {
            var personWithAddress = new PersonWithAddress();
            personWithAddress.Id = Convert.ToInt32(statement[0]);
            personWithAddress.Name = (string)statement[1];
            personWithAddress.Surname = (string)statement[2];
            personWithAddress.mAddress.Street = (string)statement[3];
            personWithAddress.mAddress.City = (string)statement[4];
            personWithAddress.mAddress.Country = (string)statement[5];

            PersonWithAddressList.Add(personWithAddress);
        }
    }
}

更多信息可以参考这篇博客:The new Portable Class Library for SQLite

多表查询的另一种方式是使用SQLite-Net Extensions,您可以指定实体中的关系。例如,在您的项目中,添加对SQLiteNetExtensions NuGet package 的引用。也可在 SQLiteNetExtensions.Async NuGet package 中获得异步支持。然后像下面这样改变你的班级:

public class Person
{
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }

    [ForeignKey(typeof(Address))]
    public int AddressId { get; set; }

    public string Name { get; set; }
    public string Surname { get; set; }

    [ManyToOne]
    public Address mAddress { get; set; }
}

public class Address
{
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }

    public string Street { get; set; }

    public string City { get; set; }
    public string Country { get; set; }

    [OneToMany(CascadeOperations = CascadeOperation.All)]
    public List<Person> Persons { get; set; }
}

在此之后,我们可以使用以下代码获取所有有地址的人:

using (var connection = new SQLiteConnection(new SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(), DB_PATH))
{
    List<Person> PersonsWithAddress = connection.GetAllWithChildren<Person>();
}

【讨论】:

    猜你喜欢
    • 2014-11-25
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多