【发布时间】:2015-02-07 13:01:40
【问题描述】:
自从几个晚上以来,我一直被这个问题困扰。我的应用程序中有SQLite 数据库。我已经从一个文件创建了那个 SQLite DB。 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。
现在发生了非常奇怪和奇怪的事情。当我尝试使用带有INNER JOIN 语句的普通SQL statemets 检索一些信息时 - 它工作正常:
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 应用程序,所以我不能为此使用实体框架。
【问题讨论】:
-
Sqlite-net 不支持外键
-
@ErikEJ,嗯,但是当我使用如上所示的普通 SQL 语句使用
SELECT ... FROM ... INNER JOIN...时,它可以工作。所以它可能使用外键,不是吗? -
它不会将连接从 LINQ 转换为 SQL
-
在哪里告诉编译器
Kursy.id_kantory是支持导航到虚拟Kursy.kantory属性的外键?在实体框架中,this can be done in multiple ways,如约定。它在您的代码中是如何工作的? -
您在
SQLiteCommand上运行ExecuteQuery<T>的情况如何?您如何在SQLiteConnection上运行Table<T>()?那些不能开箱即用。您引用了哪些程序集和命名空间来获得对它们的访问权限?