LINQ to SQL(1):基础入门
LINQ to SQL是在SQL SERVER数据库上设置一个强类型化界面的方式,LINQ to SQL提供的方式是目前我所见到查询SQL SERVER最简单也是最有效的方式,他可以使用自定义的类型与数据表甚至存储过程进行对应,而不像我们使用ADO.NET那样,把更多的功夫用在数据类型转换等等的问题上,当程序运行的时候,LINQ to SQL会将我们使用自己的语言定义的模型中的语言继承查询转换为SQL,然后将他在数据库上执行,然后将返回的结果转换为我们自定义的类对象,使用过nhibernate或者ibatis.net的朋友,可能就很熟悉这种方式啦,我个人认为,LINQ to SQL在某些地方弥补了这两种框架的缺陷,而且,如果我们可以在项目中使用ORM设计器来生成我们需要的模型,毫无疑问,那将会是一件非常幸福的事情,简单的介绍就写到这里,如果您还不了解LINQ是个什么东西,就必须先去看看LINQ的基础啦,当然,在我的这期博文里,不会用到太多复杂的LINQ语句
注意:本节以及以后的数据库示例,我想会放到文章最后,有兴趣的朋友可以直接下载,如果您有sql 2000/2005的示例数据库,就不需要啦 找到northwind(下载),附加到您的数据库就可以啦。我的环境是.net framework ,开发工具visual studio 2008 SP1 开发语言c#
创建一个控制台应用程序,在默认情况下,可能没有对System.Data.Linq的引用,所以,你懂得……
创建一个类,这里我们叫他Customers.cs,我们使用这个类来映射数据库中的Customers表,我们首先在类的顶部添加如下指令
using System.Data.Linq;
using System.Data.Linq.Mapping;
然后,我们只需要添加TableAttribute属性就可以实现映射关系啦,在类的内部,定义属性,使用ColumnAttribute标记属性在类中指定与数据中中的类的映射
[Table(Name="Customers")]
public class Customers
{
private string _CustomerID;
[Column(IsPrimaryKey=true,Storage="_CustomerID")]//IsPrimaryKey指定主键,Storage指定存储区域
public string CustomerID
{
get { return this._CustomerID; }
set { this._CustomerID = value; }
}
private string _City;
[Column(Storage="_City")]
public string City
{
get { return this._City; }
set { this._City = value; }
}
}
好了,我们已经创建了一个类与一个Customers表进行映射,接来下就是LINQ to SQL中最最最重要的一个类出场啦DataContext,它是用于从数据库检索对象和提交更改的主要通道
在项目的Main方法中键入如下代码
DataContext dc = new DataContext("Data Source=XIAOYAOJIAN;Initial Catalog=Northwind;Integrated Security=True");
Table<Customers> customers = dc.GetTable<Customers>();
dc.Log = Console.Out;
IQueryable<Customers> query = from c in customers
where c.City == "London"
select c;
foreach (Customers c in query)
{
Console.WriteLine(c.CustomerID+" | "+c.City);
}
这里需要注意的几点:
1.在构造DataContext实例对象的时候,传入的是一个连接字符串,当然,它还有好几种重载
2.真正的查询是在foreach的时候才真正开始的,在定义linq规则的时候,并没有查询
运行这段代码,得出的结果基本如下图所示
下面写一个有外键关系的两个表的链接查询
在Customers.cs中添加如下内容
[Table(Name = "Orders")]
public class Order
{
private int _OrderID = 0;
private string _CustomerID;
private EntityRef<Customers> _Customer;
public Order() { this._Customer = new EntityRef<Customers>(); }
[Column(Storage = "_OrderID", DbType = "Int NOT NULL IDENTITY",
IsPrimaryKey = true, IsDbGenerated = true)]
public int OrderID
{
get { return this._OrderID; }
}
[Column(Storage = "_CustomerID", DbType = "NChar(5)")]
public string CustomerID
{
get { return this._CustomerID; }
set { this._CustomerID = value; }
}
[Association(Storage = "_Customer", ThisKey = "CustomerID")]
public Customers Customer
{
get { return this._Customer.Entity; }
set { this._Customer.Entity = value; }
}
}
修改上面我们定义的Customers类
[Table(Name="Customers")]
public class Customers
{
private string _CustomerID;
[Column(IsPrimaryKey=true,Storage="_CustomerID")]
public string CustomerID
{
get { return this._CustomerID; }
set { this._CustomerID = value; }
}
private string _City;
[Column(Storage="_City")]
public string City
{
get { return this._City; }
set { this._City = value; }
}
private EntitySet<Order> _Orders;
public Customers()
{
this._Orders = new EntitySet<Order>();
}
[Association(Storage="_Orders",OtherKey="CustomerID")]
public EntitySet<Order> Orders
{
get { return this._Orders; }
set { this._Orders = value; }
}
}
可以看到这里我们使用的是EntitySet和EntityRef来做主外键的关联的
修改Main方法中的代码
DataContext dc = new DataContext("Data Source=XIAOYAOJIAN;Initial Catalog=Northwind;Integrated Security=True");
var customers = dc.GetTable<Customers>();
dc.Log = Console.Out;
var query = from c in customers
where c.Orders.Any()//只要有一个值
select c;
foreach (Customers c in query)
{
Console.WriteLine(c.CustomerID+" | "+c.Orders.Count);
}
这样的代码,还并不是我们想要的,因为如果我们使用ORM来生成LINQ to SQL模型的话,是没有像GetTable这种东西出现的,二十在查询的时候,可以直接使用强类型话的类对象,那么他是如何实现的呢,继续往下看
在Customer.cs中命名空间下添加如下代码
public class Northwind : DataContext
{
public Table<Customers> Customers;
public Table<Order> Orders;
public Northwind(string connection) : base(connection) { }
}
这里,我们实现了一个强类型化的DataContext类,继承自DataContext类
修改Main方法中的代码
Northwind dc = new Northwind("Data Source=XIAOYAOJIAN;Initial Catalog=Northwind;Integrated Security=True");
var customer = from c in dc.Customers
where c.Orders.Any()
select c;
dc.Log = Console.Out;
foreach (Customers c in customer)
{
Console.WriteLine(c.CustomerID + " | " + c.City);
}
Console.ReadKey();
这里我们使用了匿名类型var,在这里,其实它是一个实现了IQueryable接口的一个对象
这里我们已经不需要gettable这种方式啦,这样,我们就实现了一个简单的使用ORM设计器实现的LINQ to SQL模型,怎么样,LINQ to SQL的查询方式,是不是很让人心潮澎湃啊
- 算法类面试题解析——美团2016校招:棋子翻转
- 算法类面试题解析——美团2016校招:最大差值
- 用Python进行机器学习小案例
- 启用ODM极速调优IO (r2笔记66天)
- 通过addm分析io问题(r2笔记64天)
- python爬虫+R数据可视化 实例
- 梯度下降优化算法综述
- 关于oracle后台启用的schedule job(r2笔记65天)
- 数据结构和算法——二叉树
- 【专业技术】谷歌浏览器实现Javascript扩展
- 数据结构和算法——二叉排序树
- 通过shell脚本生成查询表数据的sql (r2笔记63天)
- Linux C 编程——多线程
- 数据结构和算法——Huffman树和Huffman编码
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android 客户端RSA加密的实现方法
- Android圆形头像拍照后“无法加载此图片”的问题解决方法(适配Android7.0)
- Android 中Failed to read key from keystore解决办法
- Android圆角按钮的制作方法
- Android计时器控件Chronometer应用实例
- Android 中利用 ksoap2 调用 WebService的示例代码
- Android自定义View展示Wifi信号强弱指示方法示例
- android事件分发机制的实现原理
- Android 在子线程中更新UI的几种方法示例
- WebView设置WebViewClient的方法
- Android星级评分条的实现代码
- Android模仿美团顶部的滑动菜单实例代码
- android实现按钮获取焦点延迟加载
- Devtools 老师傅养成[1] - Chrome Devtools介绍
- Android4.4开发之电池低电量告警提示原理与实现方法分析