LINQ体验(4)——LINQ简介和LINQ to SQL语句之Where

LINQ体验(4)——LINQ简介和LINQ to SQL语句之Where

查询表达式(LINQ)简介

在上两篇我介绍了C#3.0新语特性和改进,这些新特性在我们编写程序时为我们提供了非常大的帮助。从这篇开始,我们开始一起来探讨LINQ。

LINQ是Language Integrated Query的简称,它是集成在.NET编程语言中的一种特性。已成为编程语言的一个组成部分,在编写程序时可以得到很好的编译时语法检查,丰富的元数据,智能感知、静态类型等强类型语言的好处。并且它同时还使得查询可以方便地对内存中的信息进行查询而不仅仅只是外部数据源。

LINQ定义了一组标准查询操作符用于在所有基于.NET平台的编程语言中更加直接地声明跨越、过滤和投射操作的统一方式,标准查询操作符允许查询作用于所有基于IEnumerable<T>接口的源,并且它还允许适合于目标域或技术的第三方特定域操作符来扩大标准查询操作符集,更重要的是,第三方操作符可以用它们自己的提供附加服务的实现来自由地替换标准查询操作符,根据LINQ模式的习俗,这些查询喜欢采用与标准查询操作符相同的语言集成和工具支持。

我们来总体看看LINQ架构

LINQ架构

在.NET3.5下,微软为我们提供了一些命名空间

命名空间

LINQ包括五个部分:LINQ to Objects、LINQ to DataSets、LINQ to SQL、LINQ to Entities、LINQ to XML。

LINQ to SQL全称基于关系数据的.NET语言集成查询,用于以对象形式管理关系数据,并提供了丰富的查询功能。其建立于公共语言类型系统中的基于SQL的模式定义的集成之上,当保持关系型模型表达能力和对底层存储的直接查询评测的性能时,这个集成在关系型数据之上提供强类型。

LINQ to XML在System.Xml.LINQ命名空间下实现对XML的操作。采用高效、易用、内存中的XML工具在宿主编程语言中提供XPath/XQuery功能等。

说了这么多,我们还是用一个简单的实例说明一下LINQ带来的体验。

第一步:建立dbml(Database Mark Language。数据库描述语言,是一种xml格式的文档,用来描述数据库)文件,以Northwind数据库为例,上述Customers类被映射成一个表,对应数据库中的 Customers表

第一步:建立dbml文件

第二步:创建一个ASP.NET页面,在页面上加入一个GridView控件

第二步:在页面上拖一个GridView控件用于显示

第三步:编写代码进行数据绑定

第三步:编写后台绑定代码

第四步:运行显示结果。

第四步:显示

好了,就说这么多吧,大家应该对LINQ有了总体的了解。最后我对LINQ还有一点疑惑,在此提出,请熟悉的朋友来探讨:

  1. LINQ是在ADO.NET之上的,那么在将来它会代替ADO.NET吗?
  2. 在大型项目中使用LINQ,它的效率如何呢?

接下来,我们开始从LINQ to SQL语句入手,来全面了解一下LINQ,就从最简单的Where说起吧,这个在编写程序中也最为常用。

Where操作

适用场景:实现过滤,查询等功能。

说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的子句。

Where操作包括3种形式,分别为简单形式、关系条件形式、First()形式。下面分别用实例举例下:

1.简单形式:

var q =
    from c in db.Customers
    where c.City == "London"
    select c;
var q =
    from e in db.Employees
    where e.HireDate >= new DateTime(1994, 1, 1)
    select e;

2.关系条件形式:

var q =
    from p in db.Products
    where p.UnitsInStock <= p.ReorderLevel && !p.Discontinued
    select p;
var q =
    from p in db.Products
    where p.UnitPrice > 10m || p.Discontinued
    select p;
var q =
    db.Products.Where(p=>p.UnitPrice > 10m).Where(p=>p.Discontinued);

3.First()形式:

返回集合中的一个元素,其实质就是在SQL语句中加TOP (1)

Shipper shipper = db.Shippers.First();
Customer cust = db.Customers.First(c => c.CustomerID == "BONAP");
Order ord = db.Orders.First(o => o.Freight > 10.00M);

本系列链接:LINQ体验系列文章导航


作者:李永京YJingLee's Blog
出处:http://lyj.cnblogs.com
转载请注明此处,谢谢!

Tag标签: LINQ,LINQ to SQL
posted @ 2008-01-20 14:08 李永京 阅读(9205) 评论(37)  编辑 收藏 所属分类: LINQ

  回复  引用  查看    
#1楼 2008-01-20 15:55 | lanWay      
個人認為這跟ado.net本質上沒有什麼區別,只是提供方便快捷的訪問和控制方式
就如同ado與ado.net的進化是同時性質一樣,只是在對象的結構上變化,而原理未變,但也是一種進步..
而性能上所佔的資源一定會ado.net多,畢竟直觀化和方便性要有代價的,但穩定性和數據處理效率上應該會比較好

  回复  引用  查看    
#2楼 [楼主]2008-01-20 16:09 | 李永京      
@lanWay
感觉有道理,之前,ADO.NET被用来做数据访问层。我们去写事务逻辑层类。比如,Customer。然后,写sql语句,通过ADO.NET,将返回的记录,来初始化Customer等类的对象。
现在,通过Table和Class之间的映射,可以直接面向对象的编写程序,像上面一样。方便了很多。效率应该比较好。他从DBML直接进Database了。
  回复  引用  查看    
#3楼 2008-01-20 16:19 | lanWay      
多謝,不過LINQ還沒怎麼接觸,正從你的文章學習中...呵呵.
  回复  引用  查看    
#4楼 2008-01-20 16:56 | SZW      
楼主可以把FirstOrDefault()和First()一起介绍一下,包括SingOrDefatul(),可以减少很多Exist方面的判断,Linq对First(),Single()之类的空记录会抛出异常,这些Default在一些允许空记录的实际应用中被用到的次数可能会更多一些:)
  回复  引用  查看    
#5楼 [楼主]2008-01-20 17:11 | 李永京      
@lanWay
互相学习,园子里还有很多朋友有系列文章,你也可以去看看
  回复  引用  查看    
#6楼 [楼主]2008-01-20 17:11 | 李永京      
@SZW
有道理,这篇只是简单的说下where,下篇从select说起,每条语句都分析一下,这篇仅仅列举了几个语句,没有具体说下,因为where语句挺简单,也没有什么注意点说明的。
  回复  引用    
#7楼 2008-01-21 19:48 | frgg [未注册用户]
linq个人感觉好像是提供了统一的面向对象的数据访问方式吧?
  回复  引用  查看    
#8楼 [楼主]2008-01-23 12:17 | 李永京      
@frgg
是的,就是OO
  回复  引用  查看    
#9楼 2008-01-27 12:03 | SZW      
@李永京
期待+关注:)
  回复  引用    
#10楼 2008-03-04 11:26 | hao Lifeng [未注册用户]
后生可谓啊,我这个老家伙还在看你的教程啊,呵呵,共同学习,努力吧!
  回复  引用  查看    
#11楼 2008-03-07 10:57 | xujh      
正在从Vs2005向2008转移,谢谢你的文章
  回复  引用  查看    
#12楼 [楼主]2008-03-07 14:33 | 李永京      
@xujh
不客气!
  回复  引用  查看    
#13楼 [楼主]2008-03-07 14:34 | 李永京      
@hao Lifeng
没有那么夸张吧,呵呵
  回复  引用  查看    
#14楼 2008-04-08 18:16 | Vincent Love      
有没有实现模糊查询功能啊
比如在t-sql中的link '%.....%'
  回复  引用  查看    
#15楼 [楼主]2008-04-08 20:45 | 李永京      
@Vincent Love
有的啊,看看http://www.cnblogs.com/lyj/archive/2008/02/24/1079551.html
String.Contains(substring),5.String.StartsWith(prefix),String.EndsWith(suffix)等方法
  回复  引用  查看    
#16楼 2008-04-23 16:58 | 鹏鹏_Lovely      
--引用--------------------------------------------------
lanWay: 多謝,不過LINQ還沒怎麼接觸,正從你的文章學習中...呵呵.
--------------------------------------------------------



谢谢楼主哟。大丰收啊。

  回复  引用  查看    
#17楼 [楼主]2008-04-23 17:27 | 李永京      
@鹏鹏_Lovely
呵呵,谢谢支持啊。
  回复  引用    
#18楼 2008-05-15 13:20 | appledf [未注册用户]
不能没有区别吧
(以前的学习)
linq的推出 是为了什么??
让程序员(对sql语法不是特别精通)从编写sql语句中解放出来

从这一点不过是 锦上添花 的技术,节省了开发时间,牺牲了运行效率。

而3.5的entity framework的推出 又是为了解决什么??
读取数据的阻抗失衡,关系数据库的oo开发。

个人觉得 差距很大

  回复  引用  查看    
#19楼 [楼主]2008-05-15 14:21 | 李永京      
@appledf
主要就是面向OO,提高了编写的效率,降低了程序效率
  回复  引用  查看    
#20楼 2008-06-25 10:48 | 小牛大牛      
@李永京
--引用--------------------------------------------------
李永京: @lanWay
感觉有道理,之前,ADO.NET被用来做数据访问层。我们去写事务逻辑层类。比如,Customer。然后,写sql语句,通过ADO.NET,将返回的记录,来初始化Customer等类的对象。
现在,通过Table和Class之间的映射,可以直接面向对象的编写程序,像上面一样。方便了很多。效率应该比较好。他从DBML直接进Database了。
--------------------------------------------------------

刚接触.net和linq,
看到你说"通过Table和Class之间的映射,可以直接面向对象的编写程序",怎么听起来好像java中的Hibernate的那种感觉,是把数据库对象映射成类对象,然后面向类对象编程吗??
  回复  引用  查看    
#21楼 [楼主]2008-06-25 11:09 | 李永京      
@小牛大牛
Hibernate 就是Java上非常成熟的ORM框架,主要映射了数据库表并且框架内部自动根据表生成了各种sql语句,我们不用写sql语句,只需调用一些增删查改方法就可以了
LINQ to SQL是.NET Framework 3.5中自带的轻量级ORM框架,只是映射了表和类,至于完成的功能,我们要用sql或者linq to sql来写查询语句。
  回复  引用  查看    
#22楼 [楼主]2008-06-25 11:10 | 李永京      
@小牛大牛
补充,linq是完全面向对象的编程的,还有丰富的智能提示。
  回复  引用  查看    
#23楼 2008-06-25 16:24 | 小牛大牛      
看了你的例子,你说的LINQ to SQL 要用sql或linq to sql来写查询语句是类似下面这样的的吗:
var q =
from e in db.Employees
where e.HireDate >= new DateTime(1994, 1, 1)
select e;

要是这样的话,Hibernate里面也要写的,是hql语句,差不多的了.
谢谢你的答复,我要通过你的系列文章好好学学.(*^__^*)
  回复  引用  查看    
#24楼 [楼主]2008-06-25 18:56 | 李永京      
@小牛大牛
o(∩_∩)o... 都差不多的。
  回复  引用  查看    
#25楼 2008-07-10 12:15 | 小毛      
请问显示前5条记录,并且排序是按时间降序排列,如何写?
  回复  引用    
#26楼 2008-07-11 15:46 | jy02859735 [未注册用户]
public IList StudentList()
{
StudnetDataContext dc=new StudentDataContext();

var list =from c in dc.Student
where c.Gender=="男"
orderby c.Birthday descending
select c;

return list.ToList().Takes(5);
}

该方法最后返回的是:按照学生生日降序排列的前5位男生的IList列表


  回复  引用  查看    
#27楼 [楼主]2008-07-11 20:49 | 李永京      
@jy02859735
谢谢回复,一直没有时间上网
  回复  引用    
#28楼 2008-07-21 20:40 | yangyangarush [未注册用户]
--引用--------------------------------------------------
jy02859735: public IList StudentList()
<br>{
<br> StudnetDataContext dc=new StudentDataContext();
<br>
<br> var list =from c in dc.Student
<br> where c.Gender==&quot;男&quot;
<br> orderby c.Birthday descending
<br> select c;
<br>
<br> return list.ToList().Takes(5);
<br>}
<br>
<br>该方法最后返回的是:按照学生生日降序排列的前5位男生的IList列表
<br>
<br>
--------------------------------------------------------
这样写程序效率太低了吧 ,如果list中的对象很多呢?
  回复  引用    
#29楼 2008-07-24 02:30 | 再来 [未注册用户]
感觉借鉴了Ruby。
  回复  引用  查看    
#30楼 [楼主]2008-07-28 23:07 | 李永京      
@yangyangarush
效率还是不如啊,但是方便
  回复  引用  查看    
#31楼 2008-07-31 19:26 | tensun _____飞机来勒      
StudnetDataContext dc=new StudentDataContext();
请问StudnetDataContext 这个是自己写的类还是哪里生成的?
可以直接关联到数据库么?
  回复  引用    
#32楼 2008-08-02 00:13 | fxfsgnr [未注册用户]
貌相很像 NHibernate
  回复  引用  查看    
#33楼 [楼主]2008-08-09 23:10 | 李永京      
@tensun _____飞机来勒
StudnetDataContext 就是DataContext,文件名为Studnet
  回复  引用  查看    
#34楼 [楼主]2008-08-09 23:10 | 李永京      
@fxfsgnr