c # sqlite внутреннее соединение - PullRequest
0 голосов
/ 08 января 2019

Я создаю приложение Xamarin Cross Platform в VS2017, которое использует базу данных SQLite, и я пытаюсь понять, как выполнить запрос, используя внутреннее соединение. Я использую пакет NuGet sqlite-net-pcl.

Я создал базу данных, используя DB Browser для SQLite. У меня есть 2 простые таблицы.

class Crime
{
    [PrimaryKey, AutoIncrement]
    public int Id {get; set; }
    [NotNull]
    public string Name { get; set; }
    [NotNull]
    public int Legislation { get; set; }
}

class Legislation
{
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }
    [NotNull]
    public string Title { get; set; }
}

Использование браузера БД У меня настроен внешний ключ для Crime.Legislation, связанный с Legislation.Id.

Я легко могу запросить одну таблицу и заполнить список, используя код ниже.

public partial class LegislationListPage : ContentPage
{
    private SQLiteAsyncConnection _connetion;
    private ObservableCollection<Legislation> _legislations;
    public LegislationListPage ()
    {
        InitializeComponent ();
        _connetion = DependencyService.Get<ISQLiteDb>().GetConnection();
    }

    protected override async void OnAppearing()
    {
        await _connetion.CreateTableAsync<Legislation>();

        var legislations = await _connetion.Table<Legislation>().OrderBy(x => x.Title).ToListAsync();
        _legislations = new ObservableCollection<Legislation>(legislations);
        legislationList.ItemsSource = _legislations;
    }
}

На другой странице я хочу выполнить запрос, который возвращает столбец «Имя» из «Преступления» и столбец «Заголовок» из законодательства.

Я могу добиться этого в SQL в браузере БД, используя

select c.Name, l.Title from Legislation as l inner join Crimes as c on l.Id = c.Legislation

Однако я не знаю, как это сделать с помощью c #, как я делал с предыдущими запросами. Я не могу найти какие-либо методы .join или что-нибудь подобное. Я надеюсь сохранить результаты в списке, основанном на классе, который создается на лету, но я не уверен, возможно ли это, поэтому я счастлив создать новый класс для хранения результата двух строк это будет возвращено. Конечная цель - заполнить список результатами.

Если бы кто-то мог указать мне правильное направление, это было бы здорово.

Заранее спасибо.

1 Ответ

0 голосов
/ 08 января 2019

Хорошо, мне удалось найти решение. Очень просто на самом деле. Я не смог найти метод .join, потому что я не использовал System.Linq.

Есть два способа сделать это. Использование синтаксиса запроса и лямбда. Лямбда - это то, что я надеялся найти, поэтому я рад, что у меня все получилось.

Для тех, кто ищет что-то похожее, здесь есть два способа, которыми я

// First I put both tables into separate lists ( var crimes and var legislation) using the 
// way shown in my question. Code for that is omitted here

//Query style
var crimesListItems = from c in crimes
                      join l in legislations on c.Legislation equals l.Id
                      select new { c.Name, l.Title };

// Lambda style
var crimesListItems = crimes.Join(
          legislations,
          c => c.Legislation,
          l => l.Id,
          (c, l) => new {c.Name, l.Title} );

Благодарность Джереми Кларку и его учебнику по https://www.youtube.com/watch?v=tzR2qY6S4yw

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...