2016-02-02 2 views
1

Je sais que nous pouvons faire une requête plusieurs tables, comme ceci:UWP SQLite classe résultat de la requête contient une autre classe

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

* Référence de Query multiple tables SQLite Windows 10 UWP

Mais que diriez-vous que je dois la classe résultat PersonWithAddress devrait être:

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

Je suis à la recherche d'un moyen de DataReader, mais il est semble SQLite sur UWP ne soutiens le.

+0

La question liée mentionne également SQLite Net.Extensions. Est-ce que tu l'as essayé? –

Répondre

3

Voici un Portable Class Library for SQLite qui fournit une méthode semblable au DataReader.

Pour utiliser cette bibliothèque, nous pouvons l'installer former NuGet puis l'utiliser comme suit:

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

Pour plus d'informations, vous pouvez consulter ce blog: The new Portable Class Library for SQLite.

Une autre méthode pour plusieurs requêtes de tables est l'utilisation de SQLite-Net Extensions, vous pouvez spécifier les relations dans les entités. Par exemple, dans votre projet, ajoutez une référence à SQLiteNetExtensions NuGet package. Également disponible avec le support Async au SQLiteNetExtensions.Async NuGet package. Puis changez votre classe comme suit:

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

Après cela, nous pouvons utiliser le code suivant pour obtenir toutes les personnes Adresse:

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