Utknąłem z tym problemem od kilku wieczorów. Mam bazę danych SQLite
w mojej aplikacji. Stworzyłem SQLite DB z pliku. Diagram ERD znajduje się poniżej: SQLite - pobieranie danych przy użyciu LINQ
A teraz w mojej aplikacji utworzyć połączenie do mojej bazy danych:
using (var conn = new SQLiteConnection(DB_PATH))
{
// retrieving statemets...
}
stworzyłem klas, które reprezentują tabele w moim DB:
public class Kantory
{
public Kantory()
{
this.kursy = new HashSet<Kursy>();
}
[SQLite.PrimaryKey, SQLite.AutoIncrement]
public int id_kantory { get; set; }
public string nazwa { get; set; }
public virtual ICollection<Kursy> kursy { get; set; }
}
public class Waluty
{
public Waluty()
{
this.kursy = new HashSet<Kursy>();
}
[SQLite.PrimaryKey, SQLite.AutoIncrement]
public int id_waluty { get; set; }
public string nazwa { get; set; }
public virtual ICollection<Kursy> kursy { get; set; }
}
public class Kursy
{
[SQLite.PrimaryKey, SQLite.AutoIncrement]
public int id_kursy { get; set; }
public int id_kantory { get; set; }
public int id_waluty { get; set; }
public decimal kurs { get; set; }
public System.DateTime data { get; set; }
public int aktualne { get; set; }
public virtual Kantory kantory { get; set; }
public virtual Waluty waluty { get; set; }
}
Jak widać, w tabeli kursy
mam dwa klucze obce - id_kantory
i id_waluty
.
A teraz bardzo ciekawa i dziwna rzecz dzieje się. Kiedy próbuję odzyskać informacje za pomocą zwykłych statemets SQL z INNER JOIN
oświadczenia - to działa dobrze !:
using (var conn = new SQLiteConnection(DB_PATH))
{
var query = new SQLiteCommand(conn);
query.CommandText = "SELECT * FROM Kursy INNER JOIN Kantory ON Kursy.id_kursy=Kantory.id_kantory WHERE Kantory.id_kantory = 1";
var result = query.ExecuteQuery<Kursy>();
}
Ten kod działa poprawnie! Ale gdy próbuję użyć moich klas przy użyciu LINQ tak:
using (var conn = new SQLiteConnection(DB_PATH))
{
var result = conn.Table<Kursy>().Where(k => k.kantory.id_kantory == 1).FirstOrDefault();
}
To rzuca mi NotSupportedException! messsage to: dostęp Użytkownik nie udało się skompilować wyraz
ale kiedy używam moje zajęcia z wykorzystaniem LINQ bez łączenia inna klasa działa !:
using (var conn = new SQLiteConnection(DB_PATH))
{
var result = conn.Table<Kursy>().Where(k => k.id_kursy == 1).FirstOrDefault();
}
Więc w końcu: mój problem jest to Nie mogę dołączyć więcej do tej tabeli przy użyciu zapytania LINQ. Wydaje się, że ten model na zajęciach jest błędny, ale naprawdę nie wiem dlaczego ...
PS. Jest to aplikacja Windows Phone 8.1, więc nie mogę użyć do tego Struktury Entity.
Sqlite-net nie obsługuje kluczy obcych – ErikEJ
@ErikEJ, hmm, ale kiedy używam zwykłej instrukcji SQL, jak pokazano powyżej, używając 'SELECT ... FROM ... INNER JOIN ...' to działa. Więc prawdopodobnie używa obcych kluczy, prawda? – XardasLord
Nie tłumaczy sprzężeń od LINQ do SQL – ErikEJ