如何在不依赖Entity Framework的情况下使用System.Data.SQLite.Linq查询SQLite数据库
不依赖Entity Framework,用System.Data.SQLite.Linq查询SQLite数据库
核心思路:绕开EF,直接用Linq to SQLite的原生实现
你观察得很准——System.Data.SQLite.Linq确实和带EF6后缀的版本共享大部分核心代码,只是后者绑定了EF依赖。要纯用它的话,关键是直接使用它提供的SQLiteConnection和对应的Linq查询支持,完全不需要引入EF相关的上下文或类。
具体步骤和代码示例
1. 安装正确的NuGet包
确保只安装System.Data.SQLite.Linq(不要装带EF6后缀的那个),这样就不会引入Entity Framework依赖。
2. 构建数据模型类
不需要EF的DbContext或Entity特性,只需要简单的POCO类,属性名对应数据库表的列名就行:
public class User { public int Id { get; set; } public string Username { get; set; } public string Email { get; set; } }
3. 使用SQLiteConnection和Linq查询
这里的关键是用SQLiteConnection的CreateQuery<T>方法,或者直接对Table<T>进行Linq操作——这部分就是System.Data.SQLite.Linq提供的原生Linq支持,完全不依赖EF:
using System.Data.SQLite; using System.Linq; // 初始化连接 var connectionString = "Data Source=your_database.db;Version=3;"; using (var conn = new SQLiteConnection(connectionString)) { conn.Open(); // 示例1:查询所有用户 var allUsers = conn.Table<User>().ToList(); // 示例2:条件查询(Linq过滤) var filteredUsers = conn.Table<User>() .Where(u => u.Username.StartsWith("J")) .OrderBy(u => u.Id) .ToList(); // 示例3:执行自定义SQL并映射到模型 var query = conn.CreateQuery<User>("SELECT * FROM User WHERE Email LIKE @email", new SQLiteParameter("@email", "%example.com")); var usersWithExampleEmail = query.ToList(); }
为什么这能行?
你反编译看到的一致性是对的——System.Data.SQLite.Linq本身就内置了Linq to SQLite的解析逻辑,它会把Linq表达式转换成对应的SQLite原生SQL,然后通过SQLiteConnection执行,完全不需要EF的上下文或中间层。官方文档里提到的“支持Linq的包”,本质就是指这类实现了Linq查询提供者的组件,System.Data.SQLite.Linq就是其中之一,和EF是独立的。
注意事项
- 确保你的POCO类属性和数据库表列名完全匹配(大小写在SQLite里通常不敏感,但最好保持一致)
- 如果需要执行更复杂的Linq操作,比如分组、连接,
System.Data.SQLite.Linq基本都支持,它会自动转换为对应的SQLite语法 - 不要引用任何Entity Framework相关的命名空间(比如
System.Data.Entity),避免意外引入依赖
内容的提问来源于stack exchange,提问作者Johnny Qian
相关产品推荐
相关产品推荐

