LINQ to SQL(1):基础入门
2011-11-16 21:18
1231 查看
LINQtoSQL是在SQLSERVER数据库上设置一个强类型化界面的方式,LINQtoSQL提供的方式是目前我所见到查询SQLSERVER最简单也是最有效的方式,他可以使用自定义的类型与数据表甚至存储过程进行对应,而不像我们使用ADO.NET那样,把更多的功夫用在数据类型转换等等的问题上,当程序运行的时候,LINQtoSQL会将我们使用自己的语言定义的模型中的语言继承查询转换为SQL,然后将他在数据库上执行,然后将返回的结果转换为我们自定义的类对象,使用过nhibernate或者ibatis.net的朋友,可能就很熟悉这种方式啦,我个人认为,LINQtoSQL在某些地方弥补了这两种框架的缺陷,而且,如果我们可以在项目中使用ORM设计器来生成我们需要的模型,毫无疑问,那将会是一件非常幸福的事情,简单的介绍就写到这里,如果您还不了解LINQ是个什么东西,就必须先去看看LINQ的基础啦,当然,在我的这期博文里,不会用到太多复杂的LINQ语句
注意:本节以及以后的数据库示例,我想会放到文章最后,有兴趣的朋友可以直接下载,如果您有sql2000/2005的示例数据库,就不需要啦找到northwind(下载),附加到您的数据库就可以啦。我的环境是.netframework,开发工具visualstudio2008SP1开发语言c#
创建一个控制台应用程序,在默认情况下,可能没有对System.Data.Linq的引用,所以,你懂得……
创建一个类,这里我们叫他Customers.cs,我们使用这个类来映射数据库中的Customers表,我们首先在类的顶部添加如下指令
然后,我们只需要添加TableAttribute属性就可以实现映射关系啦,在类的内部,定义属性,使用ColumnAttribute标记属性在类中指定与数据中中的类的映射
好了,我们已经创建了一个类与一个Customers表进行映射,接来下就是LINQtoSQL中最最最重要的一个类出场啦DataContext,它是用于从数据库检索对象和提交更改的主要通道
在项目的Main方法中键入如下代码
这里需要注意的几点:
1.在构造DataContext实例对象的时候,传入的是一个连接字符串,当然,它还有好几种重载
2.真正的查询是在foreach的时候才真正开始的,在定义linq规则的时候,并没有查询
运行这段代码,得出的结果基本如下图所示
下面写一个有外键关系的两个表的链接查询
在Customers.cs中添加如下内容
可以看到这里我们使用的是EntitySet和EntityRef来做主外键的关联的
修改Main方法中的代码
这样的代码,还并不是我们想要的,因为如果我们使用ORM来生成LINQtoSQL模型的话,是没有像GetTable这种东西出现的,二十在查询的时候,可以直接使用强类型话的类对象,那么他是如何实现的呢,继续往下看
在Customer.cs中命名空间下添加如下代码
这里,我们实现了一个强类型化的DataContext类,继承自DataContext类
修改Main方法中的代码
这里我们使用了匿名类型var,在这里,其实它是一个实现了IQueryable接口的一个对象
这里我们已经不需要gettable这种方式啦,这样,我们就实现了一个简单的使用ORM设计器实现的LINQtoSQL模型,怎么样,LINQtoSQL的查询方式,是不是很让人心潮澎湃啊
注意:本节以及以后的数据库示例,我想会放到文章最后,有兴趣的朋友可以直接下载,如果您有sql2000/2005的示例数据库,就不需要啦找到northwind(
创建一个控制台应用程序,在默认情况下,可能没有对System.Data.Linq的引用,所以,你懂得……
创建一个类,这里我们叫他Customers.cs,我们使用这个类来映射数据库中的Customers表,我们首先在类的顶部添加如下指令
usingSystem.Data.Linq; usingSystem.Data.Linq.Mapping;
然后,我们只需要添加TableAttribute属性就可以实现映射关系啦,在类的内部,定义属性,使用ColumnAttribute标记属性在类中指定与数据中中的类的映射
[Table(Name="Customers")] publicclassCustomers { privatestring_CustomerID; [Column(IsPrimaryKey=true,Storage="_CustomerID")]//IsPrimaryKey指定主键,Storage指定存储区域 publicstringCustomerID { get{returnthis._CustomerID;} set{this._CustomerID=value;} } privatestring_City; [Column(Storage="_City")] publicstringCity { get{returnthis._City;} set{this._City=value;} } }
好了,我们已经创建了一个类与一个Customers表进行映射,接来下就是LINQtoSQL中最最最重要的一个类出场啦DataContext,它是用于从数据库检索对象和提交更改的主要通道
在项目的Main方法中键入如下代码
DataContextdc=newDataContext("DataSource=XIAOYAOJIAN;InitialCatalog=Northwind;IntegratedSecurity=True"); Table<Customers>customers=dc.GetTable<Customers>(); dc.Log=Console.Out; IQueryable<Customers>query=fromcincustomers wherec.City=="London" selectc; foreach(Customerscinquery) { Console.WriteLine(c.CustomerID+"|"+c.City); }
这里需要注意的几点:
1.在构造DataContext实例对象的时候,传入的是一个连接字符串,当然,它还有好几种重载
2.真正的查询是在foreach的时候才真正开始的,在定义linq规则的时候,并没有查询
运行这段代码,得出的结果基本如下图所示
下面写一个有外键关系的两个表的链接查询
在Customers.cs中添加如下内容
[Table(Name="Orders")] publicclassOrder { privateint_OrderID=0; privatestring_CustomerID; privateEntityRef<Customers>_Customer; publicOrder(){this._Customer=newEntityRef<Customers>();} [Column(Storage="_OrderID",DbType="IntNOTNULLIDENTITY", IsPrimaryKey=true,IsDbGenerated=true)] publicintOrderID { get{returnthis._OrderID;} } [Column(Storage="_CustomerID",DbType="NChar(5)")] publicstringCustomerID { get{returnthis._CustomerID;} set{this._CustomerID=value;} } [Association(Storage="_Customer",ThisKey="CustomerID")] publicCustomersCustomer { get{returnthis._Customer.Entity;} set{this._Customer.Entity=value;} } }
修改上面我们定义的Customers类
[Table(Name="Customers")]
publicclassCustomers
{
privatestring_CustomerID;
[Column(IsPrimaryKey=true,Storage="_CustomerID")]
publicstringCustomerID
{
get{returnthis._CustomerID;}
set{this._CustomerID=value;}
}
privatestring_City;
[Column(Storage="_City")]
publicstringCity
{
get{returnthis._City;}
set{this._City=value;}
}
privateEntitySet<Order>_Orders;
publicCustomers()
{
this._Orders=newEntitySet<Order>();
}
[Association(Storage="_Orders",OtherKey="CustomerID")]
publicEntitySet<Order>Orders
{
get{returnthis._Orders;}
set{this._Orders=value;}
}
}
可以看到这里我们使用的是EntitySet和EntityRef来做主外键的关联的
修改Main方法中的代码
DataContextdc=newDataContext("DataSource=XIAOYAOJIAN;InitialCatalog=Northwind;IntegratedSecurity=True");
varcustomers=dc.GetTable<Customers>();
dc.Log=Console.Out;
varquery=fromcincustomers
wherec.Orders.Any()//只要有一个值
selectc;
foreach(Customerscinquery)
{
Console.WriteLine(c.CustomerID+"|"+c.Orders.Count);
}
这样的代码,还并不是我们想要的,因为如果我们使用ORM来生成LINQtoSQL模型的话,是没有像GetTable这种东西出现的,二十在查询的时候,可以直接使用强类型话的类对象,那么他是如何实现的呢,继续往下看
在Customer.cs中命名空间下添加如下代码
publicclassNorthwind:DataContext
{
publicTable<Customers>Customers;
publicTable<Order>Orders;
publicNorthwind(stringconnection):base(connection){}
}
这里,我们实现了一个强类型化的DataContext类,继承自DataContext类
修改Main方法中的代码
Northwinddc=newNorthwind("DataSource=XIAOYAOJIAN;InitialCatalog=Northwind;IntegratedSecurity=True");
varcustomer=fromcindc.Customers
wherec.Orders.Any()
selectc;
dc.Log=Console.Out;
foreach(Customerscincustomer)
{
Console.WriteLine(c.CustomerID+"|"+c.City);
}
Console.ReadKey();
这里我们使用了匿名类型var,在这里,其实它是一个实现了IQueryable接口的一个对象
这里我们已经不需要gettable这种方式啦,这样,我们就实现了一个简单的使用ORM设计器实现的LINQtoSQL模型,怎么样,LINQtoSQL的查询方式,是不是很让人心潮澎湃啊
相关文章推荐
- LINQ to SQL 入门基础
- Linq To sql入门练习 Lambda表达式基础
- LINQ TO SQL Linq入门基础
- Linq to SQL:基础知识
- 一步一步学Linq to sql基础系列(一到十)
- LINQ To SQL深入学习系列之四(LINQ查询基础)
- LINQ to SQL的快速入门例子
- linq to sql 增删改查入门编[linq学习笔记一]
- C# 3.0, Linq, Linq To Sql(最佳入门)
- LINQ to SQL 基础
- [新手入门]快速学习 ADO.NET Entity Framework系列文章 #3 -- LINQ-to-SQL、EntitySQL、查询产生器方法(Query builder)三种语法
- Visual.C#.2010从入门到精通].(Visual.C#.2010.Step.By.Step)读书笔记 LINQ to SQL(二十)
- Linq To SQL 入门(1)
- LINQ to SQL的快速入门例子
- Linq to sql 入门
- 风影ASP.NET基础教学 14 LINQ TO SQL基础
- Linq To Sql 快速入门
- (原创)LINQ To SQL简单入门
- Linq to SQL --C#ORM框架 入门
- LINQ基础 之 LINQ TO SQL (二)