linq2db与T4模版

2019-04-14 21:34发布

工作需要详细了解了一下数据库,其实以前选修过,不过没什么实际应用
正好遇到新技术,顺带了解一下。

文章目录


基础概念

T4模版

T4模版是VS自带的一个自定义工具(VS新建- 文本模版)
他的文件格式是.tt和.ttinclude
格式实际上就是C#的变形,具体的语法规则这里不做展开。
大概类似下面这样 <#@ include file="LinqToDB.ttinclude" #> <# LinqToDB.DataProvider.SQLite.SQLiteTools.ResolveSQLite(typeof(System.Data.SQLite.SQLiteConnection).Assembly); { var beforeGenerateLinqToDBModel = BeforeGenerateLinqToDBModel; BeforeGenerateLinqToDBModel = () => { ConvertSQLiteMetadata(); beforeGenerateLinqToDBModel(); }; } #> <#+ void ConvertSQLiteMetadata() { foreach (var t in Tables.Values) foreach (var fk in t.ForeignKeys.Values) if (fk.MemberName.Length == 0 || char.IsDigit(fk.MemberName[0])) fk.MemberName = "FK_" + fk.MemberName; } LinqToDB.Data.DataConnection GetSQLiteConnection(string connectionString) { return LinqToDB.DataProvider.SQLite.SQLiteTools.CreateDataConnection(connectionString); } LinqToDB.Data.DataConnection GetSQLiteConnection(string path, string database) { return GetSQLiteConnection(string.Format("Data Source={0}", System.IO.Path.Combine(path, database))); } void LoadSQLiteMetadata(string connectionString) { var dataConnection = GetSQLiteConnection(connectionString); LoadMetadata(dataConnection); } void LoadSQLiteMetadata(string path, string database) { var dataConnection = GetSQLiteConnection(path, database); LoadMetadata(dataConnection); } #> 这段代码作用就是建立和数据库的连接,注意T4模版是运行在代码编译前的,也就是说,工程编译前就会运行T4模版连接数据库,并根据数据库的内部自动生成一个和数据库对应的model类.毕竟T4模版都能连接数据库了,那么生成一个.cs文件也是很容易的。可以看到通过T4模版通过反射自动的创建了一个TestDataDB类,这个类和数据库的结构是完全对应的,包括数据库表,以及表中的字段,也都自动生成了对应的类和属性。
在这里插入图片描述
T4模版文件我们可以自己写,但是linq2db默认已经给我们提供了各种数据库的T4模版。
简而言之,T4模版在本篇文章的应用里,主要是进行 Data First 的转换,从数据库自动生成Model(TestDataDb类和对应的表类)
补充:EF实体框架有3种类型,Data First、Model First、Code First ,可以区别了解一下。
所以相对于EF这种重量级的自动框架,linq2db是轻量级的半自动ORM框架(只能Data First,从数据库到Model)。

Linq2db实例

要操作数据库我们首先要连接数据库,这部分我们只要在app.config文件放好我们的连接字符串,
当我们实例化model(TestDataDB)的时候便会自动连接数据库。以微软的Access数据库为例,我们需要修改app.config文件 <configuration> <connectionStrings> <add name="TestData" providerName="Access" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=....TestData.mdb;Locale Identifier=1033;Jet OLEDB:Engine Type=5;Persist Security Info=True" /> connectionStrings> 然后代码里只要实例化model,linq查询完事。

使用Linq语句

检查Linq生成的SQL

使用SQL语句

class Program { static void Main(string[] args) { DataConnection.TurnTraceSwitchOn(); // 开启调试 DataConnection.WriteTraceLine = (sql, time) => Debug.WriteLine(sql, time); // 在调试窗口输出Linq产生的SQL语句,以及运行时间 using (var db = new TestDataDB()) { // SQL var sql = db.Query<Person>("SELECT * FROM Person"); // Linq var q = from c in db.People select c; foreach (var c in q) Console.WriteLine(c.PersonID); db.Patient_SelectByName("", ""); } } }

工程结构

整个VS工程的结构很简单,一个tt模版用于生成对应的model类(TestDataDB) 文件TestData.generated.cs
LinqToDB.Templates是.tt文件中所包含的针对各种数据库的.ttinclude文件,因为不同的数据库建立连接方式不同。
app.config中放置数据库连接字符串,new TestDataDB()时,linq2db库会自动加载.config配置文件中的连接字符串建立数据库表和实体模型的映射关系。
在这里插入图片描述
GitHub的sqlite示例
sqlite是 .sqlite 单文件数据库,不需要安装复杂的运行环境。直接使用工程中的Nuget包即可使用 sqlite数据库
是所有例子中最适合快速了解linq2db的。