linq2db与T4模版

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

文章目录

    • 基础概念
      • T4模版
      • Linq2db实例
        • 使用Linq语句
        • 检查Linq生成的SQL
        • 使用SQL语句
      • 工程结构

基础概念

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类,这个类和数据库的结构是完全对应的,包括数据库表,以及表中的字段,也都自动生成了对应的类和属性。
linq2db与T4模版_第1张图片
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配置文件中的连接字符串建立数据库表和实体模型的映射关系。
linq2db与T4模版_第2张图片
GitHub的sqlite示例
sqlite是 .sqlite 单文件数据库,不需要安装复杂的运行环境。直接使用工程中的Nuget包即可使用 sqlite数据库
是所有例子中最适合快速了解linq2db的。

你可能感兴趣的:(软件,C#)