热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基础【LINQ】.NET深入体验与实战精要(摘抄)

1,LINQ对不同数据额编程查询因数据源的不同而大相径庭,LINQ(LanguageIntegratedQuery)是一种非

    1,LINQ

      对不同数据额编程查询因数据源的不同而大相径庭,LINQ(Language Integrated Query)是一种非用来进行数据访问额编程模型,使得.NET语言可以直接支持数据查询。LINQ可以用相同的语法访问不同的数据源,无论是访问文件,XML,数据库,注册表,事件日子,活动目录,还是第三方如Flickr的数据,都可以将数据作为对象使用,能够更好地与编程模型集成。LINQ的目标是降低访问数据的复杂度。

      借助于LINQ技术,我们可以使用一种类似鱼SQL的语法来查询任何形式的数据。

   2,LINQ的架构

       LINQ包括5个部分: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功能。

3,传统的查询

     使用传统的查询方式,查询不同的数据源,如查询:数据库,对象列表,XML等数据源。

     (1)数据库查询

      在传统方式下,要访问数据库,需要命名空间Systeem.Data.SqlClient中的各个类。 

1 string connectionString="data source=127.0.0.1;Database=codematic;user id=sa;password=Int";
2 using(SqlConnection myConnection=new SqlConnection(connectionString))
3 {
4 SqlCommand cmd=myConnection.CreateCommand();
5
6 cmd.CommandText="SELECT ID,Name From PROM_PRODUCT order by ID";
7
8 myConnection.Open();
9
10 using(SqlDataReader dr=cmd.ExecuteReader())
11 {
12 while(dr.Read())
13 {
14 Reponse.Write(dr.GetInt32(0).ToString()+","+dr.GetString(1)+"");
15 }
16
17 }
18 }

简单的字符串表示,没有编译时类型检查,不知道这个字段是否存在,没有IDE的智能感知支持。

       (2)对象列表查询

      通过对象的属性&#xff0c;在一个对象的数组中查询符合条件的对象&#xff0c;这里主要用了泛型List<>,这个类的FindAll方法接收以委托方法&#xff0c;该委托方法实现为一个匿名方法&#xff0c;只返回性别是男的对象。

1 ///


2 /// 示例对象
3 ///

4 public class Man
5 {
6 private string name;
7 private string sex;
8 ///
9 /// 姓名
10 ///

11 public string Name
12 {
13 set { name &#61; value; }
14 get { return name; }
15
16 }
17
18 public string Sex
19 {
20 set { sex &#61; value; }
21 get { return sex; }
22 }
23
24 public Man(string Name, string Sex)
25 {
26 name &#61; Name;
27 sex &#61; Sex;
28 }
29 }

   对如上的对象列表进行操作&#xff1a;

1 //构造对象列表
2 List manlist &#61; new List();
3
4 manlist.Add(new Man("李天平",""));
5 manlist.Add(new Man("李嘉诚", ""));
6 manlist.Add(new Man("徐静蕾", ""));
7 //对象查询
8 List mans &#61; manlist.FindAll(
9
10 delegate(Man man)
11 {
12 return man.Sex &#61;&#61; "";
13 }
14 );
15
16 //对象遍历输出
17 foreach (Man man in mans)
18 {
19 Response.Write(man.Name&#43;","&#43;man.Sex&#43;"
");
20 }

      &#xff08;3&#xff09;XML查询

        当数据存储在XML中的时候&#xff0c;我们可以从XML中查询数据。我们可以使用XPath表达式通过XmlDocument加载XML数据&#xff0c;通过SelectNodes查询匹配的节点数据。

       

1 System.Xml.XmlDocument doc &#61; new System.Xml.XmlDocument();
2 //装入指定的XML文档
3 string path &#61; Server.MapPath("sampledata.xml");
4
5 doc.Load(path);
6 System.Xml.XmlNodeList stulist &#61; doc.SelectNodes("//学生");//选择匹配节点
7 foreach (System.Xml.XmlNode stu in stulist)
8 {
9 Response.Write(stu["姓名"].InnerText&#43;","&#43;stu["性别"].InnerText&#43;"
");
10 }
11

4&#xff0c;LINQ查询实例
       LINQ定义了统一的语法可以从不同数据源或数据格式中获取数据&#xff0c;从而减少了开发人员学习的负担&#xff0c;减少了工作量&#xff0c;在LINQ查询中&#xff0c;不管什么数据源&#xff0c;都可以看做一个对象&#xff0c;你可以使用同样的代码在XML文件&#xff0c;SQL数据库&#xff0c;ADO.NET数据集&#xff0c;.NET集合类型&#xff0c;其他数据源或数据格式中查询和传输数据。

       所有LINQ查询操作都由以下3个不同的操作组成;

       * 获取数据源。

       * 创建查询

       * 执行查询

       &#xff08;1&#xff09;数据库查询

         LINQ to SQL 使用LINQ查询来访问数据库&#xff0c;要查询数据库&#xff0c;必须对对象类和数据库中的表建立映射。指定哪个属性映射为哪个字段列。为了实现映射&#xff0c;LINQ提供了DataContext类。

         DataContext类型&#xff08;数据上下文&#xff09;是System.Data.Linq命名空间下的重要类型&#xff0c;用于把查询语句翻译成SQL语句&#xff0c;以及把数据从数据库返回给调用方和把实体额修改写入数据库。

          DataContext提供了以下一些使用功能&#xff1a;

          * 以日志形式记录DataContext生成的SQL。

          * 执行SQL&#xff08;包括查询和更新语句&#xff09;。

          * 创建和删除数据库。

         DataContext是实体和数据库之间的桥梁&#xff0c;那么首先我们需要定义映射到数据表的实体。 

1 [Table(Name &#61; "p_Product")]
2 public class Product
3 {
4 [Column(IsPrimaryKey &#61; true)]
5 public int ID { get; set; }
6
7 [Column(Name &#61;"Name")]
8 public string Name { get; set; }
9
10 [Column(Name &#61;"Descn")]
11 public string Descn{ get; set; }
12
13 [Column(Name &#61;"Price")]
14 public decimal Price{ get; set; }
15
16 }

      上述Product类被映射成一个表&#xff0c;对应数据库中的P_Product表&#xff0c;然后在类型中定义了4个属性&#xff0c;对应表中的4个字段。其中&#xff0c;ID字段是主键&#xff0c;如果没有指定Column特性的Name属性&#xff0c;那么系统会把属性名作为数据表的字段名&#xff0c;也就是说实体类的属性名就需要和数据表中的字段名一致&#xff0c;并且每个映射属性和字段的类型必须保持一致。
      具体LINQ查询&#xff1a;

 

1 //获取数据源
2 string connectionString &#61; "data source&#61;127.0.0.1;Database&#61;codematic;user id&#61;sa;password&#61;";
3 DataContext db &#61; new DataContext(connectionString);
4 Table prolist &#61; db.GetTable();
5
6 //创建查询
7 var pros &#61; from p in prolist
8 where p.Price > 1
9 orderby p.ID
10 select p;
11 //执行查询
12 foreach(Product pro in pros)
13 {
14
15 Response.Write(pro.Name&#43;","&#43;pro.Price.ToString()&#43;"
");
16 }
17 //GridView1.DataSource&#61;pros;
18

     通过GetTable方法获取表示底层数据表额Table类型&#xff0c;显然&#xff0c;数据库中的P_Product表的实体是Product类型。随后的查询句法&#xff0c;即使不懂SQL也可以看明白。从P_Product表中找出Price大于1的记录。

      其中&#xff0c;var关键字是C#3.0的新特性&#xff0c;称为隐含类型&#xff0c;这个声明和Javascripta的var类似&#xff0c;但也有不同。

       * 相同点&#xff1a;它可以用var来声明任何类型的局部变量。

       * 不同点&#xff1a;它仅仅负责告诉编译器&#xff0c;该变量需要根据初始化表达式来推断变量的类型&#xff0c;而且只能是局部变量。同时&#xff0c;既然让编译器推断类型必须在声明的时候赋值&#xff0c;所以不能是null值。

       From ,where ,select 关键字就是LINQ的查询语法&#xff0c;该句法能在代码里表达查询时增进可读性和简洁性。

      &#xff08;2&#xff09;对象列表

       对于对象列表的数据&#xff0c;LINQ中查询方式如下&#xff1a;

1 //构造对象列表
2 List manlist &#61; new List();
3
4 manlist.Add(new Man("李天平",""));
5 manlist.Add(new Man("李嘉诚", ""));
6 manlist.Add(new Man("徐静蕾", ""));
7 //创建查询
8
9 var mans&#61;from r in manlist
10 where r.Sex &#61;&#61;""
11 orderby r.Name descending
12 select r;
13
14 //执行查询
15
16 foreach(Man man in mans)
17 {
18 Response.Write(man.Name&#43;","&#43;man.Sex&#43;"
");
19 }

      通过from声明一个变量&#xff0c;在where子句中过滤条件&#xff0c;orderby进行排序&#xff0c;select执行。通过类似于SQL语句的方式按对象进行查询。
      &#xff08;3&#xff09;XML查询

        LINQ to XML是使用LINQ查询和过滤XML数据的技术。它在System.Xml.Linq命名空间中定义了基于元素的新XML类&#xff0c;而System.Xml类是基于文档的。

1 //获取数据源
2 XmlDocument doc &#61; new XmlDocument();
3 string path &#61; Server.MapPath("sampledata.xml");
4 XElement stulist &#61; XElement.Load(path);
5
6 //创建查询
7
8 var stus &#61;from r in stulist.Elements("学生")
9 where r.Element("性别").Value&#61;&#61;""
10 orderby r.Element("姓名")
11 select r;
12
13 foreach(XElement node in stus)
14 {
15 Response.Write(node);
16 }

        我们再回头对比一下上面3种方式的查询&#xff0c;基本都包括3步操作&#xff1a; 获取数据源&#xff0c;创建查询&#xff0c;执行查询。而除了获取数据源后面2步的操作语法几乎相同&#xff0c;充分体现了LINQ的优势。
      1&#xff09;获取数据源

       首先回头看看前面讲的LINQ的操作&#xff0c;可以知道LINQ大部分的操作对象都是实现了IEnumerable接口或者IQueryable的对象序列。上面写的代码实现示例中的数据源所用的数据类型是数组类型&#xff0c;而数组类型默认是支持泛型IEnumerable接口。这样才使得LINQ在执行查询操作时可以foreach来实现对数据额迭代式访问。通常把支持泛型IEnumerable接口或泛型IQueryable接口的类型称为查询类型。数组类型正因为它是查询类型&#xff0c;在做LINQ查询数据源时才不用做任何的加工。

       如果数据源是XML文档&#xff0c;则必须把它加工为支持泛型IEnumerble接口的对象。在.NET Framwork类中XElement就属于查询类型&#xff0c;因此把XML文档转化成XElement类型对象即可。

1 using System.Xml.Linq;
2
3 XElement contacts&#61;XElement.Load(&#64;"c\mycontactlist.xml");

      如果数据源是SQL数据库&#xff0c;则第一步先建立数据和实例间的关联映射。为实例对象写了查询语句后&#xff0c;LINQ会在运行时保持SQL与实例对象中的交互。在上面例子中&#xff0c;Product类型与数据库中的P_Product表对应&#xff0c;Table支持泛型IQuerable接口。
      2&#xff09;创建查询

      创建查询就是要把所需要的数据从数据源中取回来&#xff0c;并可在数据返回之前对数据进行分组&#xff0c;排序。创建查询&#xff0c;在C#中有新的语法定义。可以用它来创建查询表达式。表达式最少要包含两个子句&#xff1a;select 和 from 子句。

       在上面那个从数组汇总返回偶数的例子代码中&#xff0c;查询表达式中有个子句&#xff1a; from ,where 和 select 。从表达式可以看出它跟SQL查询语句的区别&#xff0c;LINQ查询语句中子句的顺序是颠倒过来编写的。在LINQ中&#xff0c;查询表达式保存在变量中。如果查询被设计为返回一组数据&#xff0c;那么该变量就必须为查询类型变量。很重要的一点就是&#xff0c;该变量没有任何的操作也没有返回的信息&#xff0c;它只是保存了查询表达式的信息。查询表达式的设计人员必须要考虑好一个基本问题&#xff0c;那就是表达式执行后必须返回数据。

     3&#xff09;执行查询

      执行查询又分为立即执行和延迟执行。

      * 立即执行 &#xff1a; 当查询操作返回值为单个值的方法时&#xff0c;调用时它立即执行。

      比如说返回值为单值的Cont , Max , Averag , First 方法调用时都会立即执行。它立即执行是因为这样的查询需要准备一个序列作为返回单值的计划接着上面从数组中返回偶数的例子&#xff0c;现在从中计算它返回偶数的数量&#xff0c;即是返回单值。

1 int query &#61; (from num in numbers
2 where (num %2 )&#61;&#61;0
3 select num ).Count();

       如果要强制立即执行非返回值为单值的查询操作&#xff0c;就可以在查询表达式中调用ToList(of TSource)  or  ToArray(of TSource)方法&#xff0c;如下所示&#xff1a;

1 List<int > query2&#61;(from num in numbrs
2 where (num%2)&#61;&#61;0
3 select num).ToList();
4
5
6 List<int > query3&#61;(from num in numbrs
7 where (num%2)&#61;&#61;0
8 select num).ToArray();

       * 延迟执行 &#xff1a;以查询操作立即执行相比&#xff0c;延迟执行的查询操作&#xff0c;返回的值为一组数据而不是单个值。查询操作的执行延迟到foreach迭代循环过程中&#xff0c;经历整个迭代过程。

1 //创建查询&#xff0c;但这个时候并不执行
2
3 var pros &#61; from p in prolist
4 where p.Price>1
5 orderby p.ID
6 select p;
7
8 //foreach遍历循环时才执行查询
9
10 foreach (Product pro in pros)
11 {
12 Response.Write(pro.Name&#43;","&#43;pro.Price.ToString(&#43;"
");
13 }

      在这里&#xff0c;需要说明一下&#xff0c;查询表达式保存的变量没有任何操作和查询结果。从上面语句中可以看出&#xff0c;返回的数据都保存在foreach循环中的pro中。每次查询它只返回一个序列&#xff0c;查询表达式变量&#xff08;pros&#xff09;从不保存返回结果。这也说明了&#xff0c;无论在什么时候执行返回的结果都是最新版本的塑聚&#xff0c;不必担心脏数据的出现。当有几个应用程序共享一个数据源时&#xff0c;就不必担心执行LINQ查询获取的数据&#xff0c;另一个应用程序正在修改数据&#xff0c;所返回的数据是旧的版本了。

5&#xff0c;LINQ查询语法

     如果想使LINQ运用到自己的项目开发中&#xff0c;则还需要花点时间研究一下LINQ的语法。尽管LINQ不只是能访问数据库&#xff0c;但是它在帮助程序员理解LINQ的价值时&#xff0c;首先是检验SQL 语句&#xff0c;然后再在代码中加入LINQ表达式完成同样的事情。下面的SQL 语句是在基于SQL Server的Codematic示例数据库中编写的&#xff0c;这个查询非常简单&#xff0c;列出价格大于1的产品。

select p.ID,p.Name,p.Descn,p.Price from P_Product p where p.Price>2 order by p.Name

        现在来看看用LINQ表达式做同样的事情&#xff0c;解剖并弄清楚其中的细节&#xff0c;有2种查询语法&#xff1a;查询表达式和方法查询。目前&#xff0c;暂时先考虑查询表达式&#xff0c;下面的查询表达式将从GetCustomers()返回的结果查询IEnumerable类型&#xff0c;找出那些没有居住在Berlin的顾客&#xff0c;对于这个例子&#xff0c;你会认为是GetCustomers方法查询数据库并返回IEnumerable类型的。

1 var Productlist&#61;from p in GetProducts()
2 where p.Price>1
3 orderby p.ContactName
4 select p;

目标数据var<变量>&#61;使用类型推断来赋值
数据源from&#xff08;项目&#xff09;in &#xff08;数据源&#xff09;信息源提供一组项目
过滤器where &#xff08;表达式&#xff09; distinct表达式指定筛选的条件
排序orderby &#xff08;表达式&#xff09;&#xff0c;&#xff08;表达式&#xff09;[升序][降序]控制结果的排序
计算

count&#xff08;<表达式>&#xff09;&#xff0c;sum(<表达式>) &#xff0c;min(<表达式>)

max(<表达式>) &#xff0c;avg(<表达式>)

合计源项目组
输出select(表达式)输出内容

       

      

       

 

 

转:https://www.cnblogs.com/shao-shao/articles/3497371.html



推荐阅读
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
author-avatar
mobiledu2502861377
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有