本文以Northwind数据库中的Customers和Orders表为例说明Linq to SQL的查询和添加是怎样操作的。
首先通过Linq to SQL File向导创建DataContext以及相应的Entity Class,如果不知道怎样做请看这里:Defining data model classes
创建一个Customer对象,然后把该数据添加到数据库中去。
NorthwindDataContext ctx = new NorthwindDataContext(); Customer c = new Customer { CustomerID = "Test1", CompanyName = "Test Company1" }; ctx.Customers.Add(c); ctx.SubmitChanges();
运行这段代码,在sql profile中可以看到
exec sp_executesql N'INSERT INTO [dbo].[Customers]([CustomerID], [CompanyName], [ContactName]...
这条sql语句,说明数据插入到Customer表中。然后再运行下面这段代码,看看能不能把刚才添加的数据从数据库中查询出来
Customer c1 = ctx.Customers.Single(c => c.CustomerID == "Test1"); Console.WriteLine(c1.CustomerID + " " + c1.CompanyName);
运行这段代码后,在sql profile中可以看到执行了这条sql语句
exec sp_executesql N'SELECT [t0].[CustomerID], [t0].[CompanyName], [t0].[ContactName]...
屏幕上也打印出正确的结果
现在让下面的代码一次执行看看会发生什么?
NorthwindDataContext ctx = new NorthwindDataContext(); Customer c = new Customer { CustomerID = "Test2", CompanyName = "Test Company2" }; ctx.Customers.Add(c); ctx.SubmitChanges(); Customer c1 = ctx.Customers.Single(ct => ct.CustomerID == "Test2"); Console.WriteLine(c1.CustomerID + " " + c1.CompanyName);
通过sql profile中的记录,可以发现这次只执行了插入语句而没有执行查询语句,但是查询又的确返回了正确的结果。Mtauly在video里说这是Linq to SQL的一种Cache机制,称为Identity Cache。执行查询的时候,如果datacontext发现查询条件是主键而且只有主键的时候,它会先在Cache中查找,如果找到了就返回该对象,可以猜想在datacontext内部,可能用一个hashtable类似的容易,以主键的值为key来缓存操作过的对象。 而当我们用另一个datacontext进行查询或者查询条件不只包含主键的时候,它会进行一次对数据库的查询。
下面来看看Linq to SQL怎样进行一对多关系的查询。其实很简单:
Customer c = ctx.Customers.Single(ct => ct.CompanyName == "Test Company1"); foreach (var order in c.Orders) { Console.WriteLine(order); }
通过观察sql profile,发现只有使用c.Orders,才会对orders表进行查询,而在查询customer的时候不会把与之相关的Orders全部返回,这类似与Hibernate里面的lazy initialization机制吧。 再者,Linq to SQL里面提供了一种称为Delay Loaded机制,在字段上使用。意思是只有当使用这些字段的时候,才进行一次数据库查询把这些字段选取出来提供使用,对于包含大数据字段(picture、blob)数据的表,该机制也能提高不少效率。如图:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?