Linq学习以及简单用法

Linq学习

Linqlanguage Intergrated Query)即语言集成查询

LINQ是一组语言特性和API,使得你可以使用统一的方式编写各种查询。用于保存和检索来自不同数据源的数据,从而消除了编程语言和数据库之间的不匹配,以及为不同类型的数据源提供单个查询接口。

LINQ总是使用对象,因此你可以使用相同的查询语法来查询和转换XML、对象集合、SQL数据库、ADO.NET数据集以及任何其他可用的LINQ提供程序格式的数据。

 

LINQ主要包含以下三部分:

1LINQ to Objects      主要负责对象的查询。

2LINQ to XML           主要负责XML的查询。

3LINQ to ADO.NET   主要负责数据库的查询。

  LINQ to SQL

  LINQ to DataSet

LINQ to Entities

基本LINQ查询操作:

1)获取数据源:from

 在 LINQ 查询中,第一步是指定数据源。像在大多数编程语言中一样,必须先声明变量,才能使用它。在 LINQ 查询中,最先使用 from 子句的目的是引入数据源和范围变量。

 var queryAllCustomers = from cust in customers4                                          

                                       select cust;

(2)筛选:where(同样可以使用AND(&&)和OR(||)运算符)

      筛选器使查询只返回那些表达式结果为true的元素,使用where子句生成结果。                  

  var queryLondonCustomers = from cust in customers2                                   

                                                where cust.City = "London"3                                    

                                               select cust;

 

(3)排序Orderby

   可以很方便的将返回的数据进行排序,orderby子句将返回的

序列中的元素按照被排序的类型的默认比较器进行排序。

 var queryLondonCustomers = from cust in customers

                                where cust.City = "London"

                                orderby cust.Name descending

                                select cust;

 

(4)分组Group

   使用Group可以按指定的键分组结果

 var queryLondonCustomers = from cust in customers

                      group cust by cust.City;

foreach (var queryLondonCustomer in queryLondonCustomers) 

     {    Console.WriteLine(queryLondonCustomer.Key);

       foreach (var cust in queryLondonCustomer)  

       { 

          Console.WriteLine(cust.Name);

       }   

 }

在使用group子句结束查询时,结果采用列表的列表形式。列表中的每个元素是一个具有Key成员及根据该键分组的元素列表的对象。再循环访问生成组序列的查询时,您必须使用嵌套的foreach循环,外部循环用于访问每个组,内部循环用于循环访问每个组的成员。

 

(5)联接join

联接运算创建数据源中没有显式建模的序列之间的关联。例如,您可以执                      行联接来查找位于同一地点的所有客户和经销商。在 LINQ 中,join 子句始终                      针对对象集合而非直接针对数据库表运行。  

var innerJoinQuery = from cust in customers 

                       join dist in distributors on cust.City equals dist.City                        select new {CustomerName = cust.Name, DistributorName = dist.Name};

LINQ 中,join 子句始终针对对象集合而非直接针对数据库表运行。  

  在 LINQ 中,您不必像在 SQL 中那样频繁使用 join,因为 LINQ 中的外键在对象模型中表示为包含项集合的属性。

(6)选择(投影):select

  select 子句生成查询结果并指定每个返回的元素的“形状”或类型。

  例如,您可以指定结果包含的是整个 Customer 对象、仅一个成员、成员的子集,还是某个基于计算或新对象创建的完全不同的结果类型。当 select 子句生成除源元素副本以外的内容时,该操作称为“投影”。

 

LINQ的优势

1、熟悉的语言:开发人员不必为每种类型的数据源或数据格式学习新的语言。

2、更少的编码:相比较传统的方式,LINQ减少了要编写的代码量。

3、可读性强:LINQ增加了代码的可读性,因此其他开发人员可以很轻松地理解和维护。

4、标准化的查询方式:可以使用相同的LINQ语法查询多个数据源。

5、类型检查:程序会在编译的时候提供类型检查。

6、智能感知提示:LINQ为通用集合提供智能感知提示。

7、整形数据:LINQ可以检索不同形状的数据。

top(1)

            //如果取最后一个可以按倒叙排列再取值

            var ss = (from r in db.Am_recProScheme                     

                      select r).FirstOrDefault();

 

            //()linq to ef 好像不支持 Last()

            var ss1 = db.Am_recProScheme.FirstOrDefault();

            //var ss1 = db.Am_recProScheme.First();          

 

            string sssql = "select top(1) * from Am_recProScheme";

跳过前面多少条数据取余下的数据

            //1

            var ss = (from r in db.Am_recProScheme

                      orderby r.rpId descending

                      select r).Skip(10); //跳过前10条数据,取10条之后的所有数据   

            //2  

            var ss1 = db.Am_recProScheme.OrderByDescending(p => p.rpId).Skip(10).ToList();

            //3

            string sssql = "select * from  (select ROW_NUMBER()over(order by rpId desc) as rowNum, * from [Am_recProScheme]) as t where rowNum>10";

分页数据查询

            //1

            var ss = (from r in db.Am_recProScheme

                      where r.rpId > 10

                      orderby r.rpId descending

                      select r).Skip(10).Take(10); //取第11条到第20条数据                   

 

            //2 Take(10): 数据从开始获取,获取指定数量(10)的连续数据

            var ss1 = db.Am_recProScheme.OrderByDescending(p => p.rpId).Where(p => p.rpId > 10).Skip(10).Take(10).ToList();

            //3

            string sssql = "select * from  (select ROW_NUMBER()over(order by rpId desc) as rowNum, * from [Am_recProScheme]) as t where rowNum>10 and rowNum<=20";

包含,类似like '%%'

            //1

            var ss = from r in db.Am_recProScheme

                     where r.SortsText.Contains("张")

                     select r;

            //2

            var ss1 = db.Am_recProScheme.Where(p => p.SortsText.Contains("张")).ToList();

            //3

            string sssql = "select * from Am_recProScheme where SortsText like '%张%'";

原文地址:https://www.cnblogs.com/wjrelax/p/10075358.html