我几乎没有晚上就遇到这个问题。我的应用程序中有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状态检索来检索某些信息时 - 它工作正常!:
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 WITHOUT JOINING 使用我的课程时,它可以工作!:
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应用程序,因此我不能使用实体框架。
答案 0 :(得分:11)
这是有效的代码。它仅使用EntityFramework 6.3.1而不使用任何SQLite特定程序集。
我明白您不想使用实体框架。要为此添加答案,我们需要知道您正在使用的SQLite
个特定程序集。例如,您使用的是DbLinq吗?
具体来说,哪些程序集包含以下方法?
SQLiteCommand.ExecuteQuery<T>()
SQLiteConnection.Table<T>()
在任何情况下,这里都是与Entity Framework一起使用的代码。
using System;
using System.Linq;
using System.Data.Entity;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
namespace SQLite
{
class Program
{
static void Main(string[] args)
{
using (var conn = new SQLiteConnection(@"C:\linqToSqlite.db"))
{
SeedEntities(conn);
// this is the query that DID work for you
var result1 = conn.Kursy
.Where(k => k.id_kursy == 1)
.FirstOrDefault();
Console.WriteLine(
string.Format("id_kursy:{0}", result1.id_kursy));
// this is the query that did NOT work for you
// it does work here
var result2 = conn.Kursy
.Where(k => k.kantory.id_kantory == 1)
.FirstOrDefault();
Console.WriteLine(
string.Format("id_kursy:{0}", result2.id_kantory));
}
Console.ReadKey();
}
private static void SeedEntities(SQLiteConnection conn)
{
SeedEntities(conn);
// make sure two entities exist with the appropriate ids
if (!conn.Kantory.Any(x => x.id_kantory == 1))
{
conn.Kantory
.Add(new Kantory() { id_kantory = 1 });
}
if (!conn.Kursy.Any(x => x.id_kantory == 1))
{
conn.Kursy
.Add(new Kursy() { id_kantory = 1 });
}
conn.SaveChanges();
}
}
public class SQLiteConnection : DbContext
{
public SQLiteConnection(string connString) :
base(connString) {}
public DbSet<Kantory> Kantory { get; set; }
public DbSet<Kursy> Kursy { get; set; }
}
public class Kantory
{
public Kantory()
{
this.kursy = new HashSet<Kursy>();
}
[Key]
public int id_kantory { get; set; }
public virtual ICollection<Kursy> kursy { get; set; }
}
public class Kursy
{
[Key]
public int id_kursy { get; set; }
public int id_kantory { get; set; }
public virtual Kantory kantory { get; set; }
}
}
我害怕使用与你不同的技术,因为我不知道你使用的确切装配。例如,我们不清楚您用于Table<T>()
方法的程序集。所以,我使用DbContext.Kursy
方法代替以下参考文献:
EntityFramework.dll
EntityFramework.SqlServer.dll
System.dll
System.ComponentModel.DataAnnotations.dll
换句话说,它仅适用于EntityFramework 6.1.3,并且不需要任何SQLite
特定程序集。
要获得与您的需求相关的答案,您引用了哪些SQLite
具体参考文献?