详解Linq to SQL

第一部分,什么是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)

{

returnSystem.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 selectp.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不能放在一开始就输入。

详解Linq to SQL,布布扣,bubuko.com

时间: 2024-12-15 06:56:19

详解Linq to SQL的相关文章

093:QuerySet&#160;API详解-QuerySet转换为SQL的条件

QuerySet API详解-QuerySet转换为SQL的条件: 生成一个 QuerySet 对象并不会马上转换为 SQL 语句去执行.比如我们获取 Book 表下所有的图书: books = Book.objects.all() print(connection.queries) 我们可以看到在打印 connection.quries 的时候打印的是一个空的列表.说明上面的 QuerySet 并没有真正的执行. 在以下情况下 QuerySet 会被转换为 SQL 语句执行:1.迭代:在遍历

详解强大的SQL注入工具——SQLMAP

1. 前言  Windows下的注入工具好的又贵,免费的啊D.明小子等又不好用,我们根本没必要花 时间去找什么破解的havij.pangolin什么的,特别是破解的工具很可能被绑了木马.其实 Linux下的注入工具也是非常强大的,不过分的说,可以完全取代Windows下面的所有注入 工具.  就如backtrack系统里面就有非常丰富的注入工具,对MSSQL.MYSQL.oracle等各种 数据库的应有尽有了,而且这些工具都是免费的,并且是开放源代码的,我们还可以用来修 改为合适自己使用的注入工

mysql(1)—— 详解一条sql语句的执行过程

SQL是一套标准,全称结构化查询语言,是用来完成和数据库之间的通信的编程语言,SQL语言是脚本语言,直接运行在数据库上.同时,SQL语句与数据在数据库上的存储方式无关,只是不同的数据库对于同一条SQL语句的底层实现不同罢了,但结果相同.这有点类似于java中接口的作用,一个接口可以有不同的实现类,不同的实现类对于接口中方法的实现方式可以不同,结果可以相同.这里SQL语言的作用就类似于java中的接口,数据库就类似于java中接口的实现类,SQL语句就类似于java接口中的方法.不同的是java中

详解一条sql语句的执行过程

SQL是一套标准,全称结构化查询语言,是用来完成和数据库之间的通信的编程语言,SQL语言是脚本语言,直接运行在数据库上.同时,SQL语句与数据在数据库上的存储方式无关,只是不同的数据库对于同一条SQL语句的底层实现不同罢了,但结果相同.这有点类似于java中接口的作用,一个接口可以有不同的实现类,不同的实现类对于接口中方法的实现方式可以不同,结果可以相同.这里SQL语言的作用就类似于java中的接口,数据库就类似于java中接口的实现类,SQL语句就类似于java接口中的方法.不同的是java中

共享池之八:软解析、硬解析、软软解析 详解一条SQL在library cache中解析涉及的锁

先来张大图: 结合上图来说明一下解析的各个步骤涉及的锁. 软解析.硬解析.软软解析区别的简单说明: 为了将用户写的sql文本转化为oracle认识的且可执行的语句,这个过程就叫做解析过程. 解析分为硬解析和软解析,SQL语句第一次解析时必须进行硬解析 一句话说明硬解析与软解析的区别是: 硬解析=需要生成执行计划   软解析=不需要生成执行计划 在Oracle中存在两种类型的SQL语句,一类为DDL语句,不共享使用,也就是每次执行都需要进行硬解析.还有一类就是DML语句,会进行硬解析或软解析. 硬

mysql系列详解二:sql语句操作-技术流ken

1.简介 本篇博客将详细讲解mysql的一些常用sql语句操作,例如创建数据库,删除数据库,创建表,修改表,删除表,以及简单查询案例. 2.关于mysql数据中的SQL的大小写问题 1.不区分大小写 1. sql中的关键字函数名 2. 存储过程.促存储函数.调度器 2.区分大小写 1. 库名.表名(也可以不区分--修改配置文件或者环境变量) 2. 触发器 3. 视图 3.第一类语句:与数据库相关的语句 语句1:创建数据库 CREATE DATABASE [IF NOT EXISTS] db_na

SQL Server 事务隔离级别详解

原文:SQL Server 事务隔离级别详解 标签: SQL SEERVER/MSSQL SERVER/SQL/事务隔离级别选项/设计数据库事务级别 SQL 事务隔离级别 概述 隔离级别用于决定如果控制并发用户如何读写数据的操作,同时对性能也有一定的影响作用. 步骤 事务隔离级别通过影响读操作来间接地影响写操作:可以在回话级别上设置事务隔离级别也可以在查询(表级别)级别上设置事务隔离级别.事务隔离级别总共有6个隔离级别:READ UNCOMMITTED(未提交读,读脏),相当于(NOLOCK)R

SQL Server DBA工作内容详解

原文:SQL Server DBA工作内容详解 在Microsoft SQL Server 2008系统中,数据库管理员(Database Administration,简称为DBA)是最重要的角色.DBA的工作目标就是确保Microsoft SQL Server 2008系统正常高效地运行.DBA的工作也是最繁忙的工作,无论是性能调整,还是灾难恢复,都离不开DBA的支持. 一般地,作为一个DBA,至少应该做好以下12项任务: 任务一:安装和配置; 任务二:容量规划; 任务三:应用架构设计; 任

Mysql建表与索引使用规范详解

一. MySQL建表,字段需设置为非空,需设置字段默认值. 二. MySQL建表,字段需NULL时,需设置字段默认值,默认值不为NULL. 三. MySQL建表,如果字段等价于外键,应在该字段加索引. 四. MySQL建表,不同表之间的相同属性值的字段,列类型,类型长度,是否非空,是否默认值,需保持一致,否则无法正确使用索引进行关联对比. 五. MySQL使用时,一条SQL语句只能使用一个表的一个索引.所有的字段类型都可以索引,多列索引的属性最多15个. 六. 如果可以在多个索引中进行选择,My