您的位置:首页 > 数据库

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表,我们首先在类的顶部添加如下指令

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的查询方式,是不是很让人心潮澎湃啊
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: