您的位置:首页 > 数据库

Linq to Sql 学习系列之一 预备知识

2009-09-14 17:29 267 查看
什么是
Linq to sql


Linq to sql
(或者叫
DLINQ
)是
LINQ

.NET
语言集成查询)的一部分,全称基于关系数据的
.NET
语言集成查询,用于以对象形式管理关系数据,并提供了丰富的查询功能,它和
Linq to xml

Linq to objects

Linq to dataset

Linq to entities
等组成了强大的
LINQ


要学好
LINQ
查询语法,就不得不先理解
C# 3.0
的一些新特性,下面一一简单介绍。

隐含类型局部变量



var
age = 26;

var
username = "zhuye"
;

var
userlist = new
[] {"a"
,"b"
,"c"
};

foreach
(var
user in
userlist)

Console
.WriteLine(user);

纯粹给懒人用的
var
关键字,告诉编译器(对于
CLR
来说,它是不会知道你是否使用了
var
,苦力是编译器出的),你自己推断它的类型吧,我不管了。但是既然让编译器推断类型就必须声明的时候赋值,而且不能是
null
值。注意,这只能用于局部变量,用于字段是不可以的。

匿名类型



var
data = new
{username = "zhuye"
,age = 26};

Console
.WriteLine("username:{0} age:{1}"
, data.username, data.age);

匿名类型允许开发人员定义行内类型,无须显式定义类型。常和
var
配合使用,
var
用于声明匿名类型。定义一个临时的匿名类型在
LINQ
查询句法中非常常见,我们可以很方便的实现对象的转换和投影。

扩展方法



public
static
class
helper

{

public
static
string
MD5Hash(this
string
s)

{

return
System.Web.Security.FormsAuthentication
.HashPasswordForStoringInConfigFile(s,"MD5"
);

}

public
static
bool
In(this
object
o, IEnumerable
b)

{

foreach
(object
obj in
b)

{

if
(obj==o)

return
true
;

}

return
false
;

}

}

//
调用扩展方法

Console
.WriteLine("123456"
.MD5Hash());

Console
.WriteLine("1"
.In(new
[]{"1"
,"2"
,"3"
}));

很多时候我们需要对
CLR
类型进行一些操作,苦于无法扩展
CLR
类型的方法,只能创建一些
helper
方法,或者生成子类。扩展方法使得这些需求得意实现,同时也是实现
LINQ
的基础。定义扩展方法需要注意,只能在静态类中定义并且是静态方法,如果扩展方法名和原有方法名发生冲突,那么扩展方法将失效。

自动属性



public
class
Person

{

public
string
username { get
; protected
set
; }

public
int
age { get
; set
; }

public
Person()

{

this
.username = "zhuye"
;

}

}

Person
p = new
Person
();

//p.username = "aa";

Console
.WriteLine(p.username);

意义不是很大,纯粹解决机械劳动。编译器自动为你生成
get

set
操作以及字段,并且你不能使用字段也不能自定义
get

set
操作,不过你可以分别定义
get

set
的访问级别。

对象初始化器



public
class
Person

{

public
string
username { get
; set
; }

public
int
age { get
; set
; }

public
override
string

ToString()

{

return
string
.Format("username:{0} age:{1}"
, this
.username, this
.age);

}

}

Person
p = new
Person
() {username = "zhuye"
, age=26};

Console
.WriteLine(p.ToString());

编译器会自动为你做
setter
操作,使得原本几行的属性赋值操作能在一行中完成。这里需要注意:

l

允许只给一部分属性赋值,包括
internal
访问级别

l

可以结合构造函数一起使用,并且构造函数初始化先于对象初始化器执行

集合初始化器



public
class
Person

{

public
string
username { get
; set
; }

public
int
age { get
; set
; }

public
override
string

ToString()

{

return
string
.Format("username:{0} age:{1}"
, this
.username, this
.age);

}

}

var
persons = new
List
<Person
> {

new
Person
{username = "a"
, age=1},

new
Person
{username = "b"
, age=2}};

foreach
(var
p in
persons)

Console
.WriteLine(p.ToString());

编译器会自动为你做集合插入操作。如果你为
Hashtable
初始化的话就相当于使用了两个对象初始化器。

Lambda

表达式



var
list = new
[] { "aa"
, "bb"
, "ac"
};

var
result = Array
.FindAll(list, s => (s.IndexOf("a"
) > -1));

foreach
(var
v in
result)

Console
.WriteLine(v);

其实和
2.0
中的匿名方法差不多,都是用于产生内联方法,只不过
Lambda
表达式的语法更为简洁。语法如下:

(
参数列表
) =>
表达式或者语句块

其中:

参数个数:可以有多个参数,一个参数,或者无参数。

表达式或者语句块:这部分就是我们平常写函数的实现部分(函数体)。

前面的示例分别是
1
个参数的例子,下面结合扩展方法来一个复杂的例子:

public
delegate
int
mydg
(int
a, int
b);

public
static
class
LambdaTest

{

public
static
int
oper(this
int
a, int
b, mydg
dg)

{

return
dg(a, b);

}

}

Console
.WriteLine(1.oper(2, (a, b) => a + b));

Console
.WriteLine(2.oper(1, (a, b) => a - b));

查询句法



var
persons = new
List
<Person
> {

new
Person
{username = "a"
, age=19},

new
Person
{username = "b"
, age=20},

new
Person
{username = "a"
, age=21},

};

var
selectperson = from
p in
persons where
p.age >= 20 select
p.username.ToUpper();

foreach
(var
p in
selectperson)

Console
.WriteLine(p);

查询句法是使用标准的
LINQ
查询运算符来表达查询时一个方便的声明式简化写法。该句法能在代码里表达查询时增进可读性和简洁性,读起来容易,也容易让人写对。
Visual Studio
对查询句法提供了完整的智能感应和编译时检查支持。编译器在底层把查询句法的表达式翻译成明确的方法调用代码,代码通过新的扩展方法和
Lambda
表达式语言特性来实现。上面的查询句法等价于下面的代码:

var
selectperson = persons.Where(p=>p.age>=20).Select(p=>p.username.ToUpper());

LINQ
查询句法可以实现
90
%以上
T-SQL
的功能(由于
T-SQL
是基于二维表的,所以
LINQ
的查询语法会比
T-SQL
更简单和灵活),但是由于智能感应的原因,
select
不能放在一开始就输入。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: