Я застрял с этой проблемой с нескольких вечеров. У меня есть база данных SQLite
в моем приложении. Я создал эту БД SQLite из файла. Диаграмма ERD показана ниже:
И теперь в моем приложении я создаю соединение с моей базой данных:
using (var conn = new SQLiteConnection(DB_PATH))
{
// retrieving statemets...
}
Я создал классы, которые представляют таблицы в моей БД:
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; }
}
Как вы можете видеть, в таблице kursy
у меня есть два внешних ключа - id_kantory
и id_waluty
.
И теперь происходит очень любопытная и странная вещь. Когда я пытаюсь получить некоторую информацию, используя обычные SQL-выражения с помощью оператора INNER JOIN
, он работает нормально:
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>();
}
Этот код работает отлично! НО, когда я пытаюсь использовать свои классы с помощью LINQ, например:
using (var conn = new SQLiteConnection(DB_PATH))
{
var result = conn.Table<Kursy>().Where(k => k.kantory.id_kantory == 1).FirstOrDefault();
}
Это выдает мне NotSupportedException! Сообщение выглядит так: При доступе к члену не удалось скомпилировать выражение
НО, когда я использую свои классы, используя LINQ БЕЗ СОЕДИНЕНИЯ другого класса, это работает:
using (var conn = new SQLiteConnection(DB_PATH))
{
var result = conn.Table<Kursy>().Where(k => k.id_kursy == 1).FirstOrDefault();
}
В итоге: моя главная проблема в том, что я не могу объединить более одной таблицы с помощью запроса LINQ. Кажется, что эта модель в классах не так, но я действительно не знаю, почему...
PS. Это приложение для Windows Phone 8.1, поэтому я не могу использовать Entity Framework для этого.