SQLite: правильный способ создания базы данных и доступа к ее данным с помощью идентификатора AUTOINCREMENT? - PullRequest
0 голосов
/ 24 ноября 2018

Предположим, у меня есть база данных, содержащая исполнителей и их альбомы.

CREATE TABLE Artist (
ArtistID INTEGER        PRIMARY KEY,
ArtistName TEXT NOT NULL
);


CREATE TABLE Album(
AlbumName TEXT PRIMARY KEY,
ArtistID INTEGER REFERENCES Artist(ArtistID),
Year INTEGER
);

Итак, я создаю приложение в Visual Studio и подключаю базу данных SQLite к своему проекту с помощью компактного набора инструментов сервера sqlite / sql server.Затем я хочу управлять базой данных с помощью C #

. Я создаю приложение для своих пользователей.Пользователь хочет найти все альбомы по имени исполнителя.

Если мой первичный ключ является свойством автоинкремента, должен ли я использовать такой синтаксис, как:

public static IQueryable<Artist> GetPossibleArtists(string name)
{
    var matches = from match in dB.Artists where match.ArtistName == name select match;

    return matches;
}

public static Artist GetFirstArtistIfExists(string artistName)
{
    var artistMatches = GetPossibleArtists(artistName);

    if (artistMatches.Count() == 0)
        return null;
    return artistMatches.First();
}

, чтобы яСначала зайдите в базу данных, чтобы найти исполнителя по его идентификатору, потому что я не могу просто найти альбомы по имени исполнителя, потому что имя исполнителя не является первичным ключом, и я не могу искать в таблице «Альбомы» по имени исполнителя, ямогу искать в этой таблице только по идентификатору исполнителя. И тогда я смогу наконец найти все альбомы по идентификатору исполнителя.

public static IQueryable<Album> GetPossibleAlbums(long artistID)
{
    var matches = from match in dB.Albums where 
                  match.ArtistID == artistID
                  select match;

    return matches;
}

Вопросы: 1) Что я делаю не так, и есть ли лучший способполучить доступ ко всем альбомам исполнителя, чтобы мне не нужно было обращаться к базе данных, чтобы "найти идентификатор исполнителя по его имени", прежде чем мне удастся найти все альбомы по ArtistID?2) Возможно, я неправильно спроектировал свою базу данных, есть предложения?3) Является ли хорошей идеей сохранить имя исполнителя в таблице «Альбом» и как мне это сделать, чтобы сохранить первичный ключ автоинкремента моего исполнителя в то же время?

1 Ответ

0 голосов
/ 24 ноября 2018

Вам нужно JOIN, чтобы связать таблицу Albums с таблицей Artists в поле ArtistID

var matches = from a in dB.Albums join b in db.Artists on a.ArtistID equals b.ArtistID
              where b.ArtistName == artistName
              select a;

объединить предложение C # ссылка

...