Friday, May 21, 2010

05/21: (ZT) Linq Basic

 

1.在.net类库中,LINQ相关类库都在System.Linq命名空间下。该命名空间提供支持使用LINQ进行查询的类和接口,其中最重要的是两个类和两个接口。

  • IEnumerable<T>接口:它表示可以查询的数据集合,一个查询通常是逐个对集合中的元素进行筛选操作,返回一个新的IEnumerable<T>对象,用来保存查询结果。
  • IQuerable<T>接口:它继承IEumerable<T>接口,表示一个可以查询的表达式目录树
  • Enumerable类,它通过对IEnumerable<T>提供扩展方法,实现LINQ标准查询运算符。包括过滤、导航、排序、查询、联接、求和、求最大值、求最小值等操作。
  • Queryable类:它通过对IQueryable<T>提供扩展方法,实现LINQ标准查询运算符。包括过滤、导航、排序、查询、联接、求和、求最大值、求最小值等操作。

Iqueryable VS Ienuerable

 

IQueryable<T> is a very powerful feature that enables a variety of interesting deferred execution
scenarios (like paging and composition based queries). As with all powerful features, you want to be
careful with how you use it and make sure it is not abused.
It is important to recognize that returning an IQueryable<T> result from your repository enables calling
code to append on chained operator methods to it, and so participate in the ultimate query execution.
If you do not want to provide calling code this ability, then you should return back IList<T>, List<T> or
IEnumerable<T> results - which contain the results of a query that has already executed.

 

 

IQueryable<T> 是将Skip ,take 这些方法表达式翻译成T-SQL语句之后再向SQL服务器发送命令。也是延迟在我要真正显示数据的时候才执行。

 

IEnumerable<T> 泛型类在调用自己的SKip 和 Take 等扩展方法之前数据就已经加载在本地内存里了

 

 

 

Sampe code :

 

using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;

namespace LinqLamadaTest
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] intary = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 89, 10 };

            // lamada expression
            var s=intary.Where(ss=>ss%2==0);

            var intMin = intary.Min();
            var intMax = intary.Max();
            var intSum = intary.Sum();
            var intAverage = intary.Average();

            // ling query expression
          //  keyword in Linq query
            // from      指定要查找的数据源以及范围变量,多个from子句则表示从多个数据源查找数据
            // select      指定查询要返回的目标数据,可以指定任何类型,甚至是匿名类型
            //where      指定元素的筛选条件,多个where子句则表示了并列条件,必须全部都满足才能入选
            //orderby      指定元素的排序字段和排序方式。当有多个排序字段时,由字段顺序确定主次关系,可指定升序和降序两种排序方式
            //group        指定元素的分组字段
            // join      指定多个数据源的关联方式
            //sample:
            int[] intAry1 = { 5, 15, 25, 30, 40, 50, 60, 70, };
            int[] intAry2 = { 10, 20, 30, 40, 50, 60, 40, 6, 2345, 23 };
            var query1 = from val1 in intAry1
                         join val2 in intAry2 on val1 equals val2 into valGrp
                         from grp in valGrp.DefaultIfEmpty()
                         select new { Val1 = val1, Val2 = grp };

            var s1 = from k in intary
                     where k %2==0 && k!=2
                     select k;

            // s1 is Ienumberable <T>

            IEnumerable<T>接口主要成员

// Aggregate      对序列应用累加器函数,可以指定累加方法
// Sum   计算序列中所有元素的和,返回值有int、long、float、double、decimal类型,并且可以指定元素到数值的映射方法
// Average  计算序列中所有元素的平均值,返回值有int、long、float、double、decimal类型,并且可以指定元素到数值的映射方法
// Max      计算序列中所有元素的最大值,返回值有int、long、float、double、decimal类型,并且可以指定元素到数值的映射方法
// Min      计算序列中所有元素的最小值,返回值有int、long、float、double、decimal类型,并且可以指定元素到数值的映射方法
// All      检查是否序列中所有元素都满足条件,可以指定条件判断方法。如果所有元素都满足条件返回True,否则返回False
// Any      检查序列中是否有任何一个元素满足条件,可以指定条件的判断方法。如果有一个以上(含一个)元素满足条件返回True,否则返回    False
// Contains      检查数据系列中是否包含特定的元素,可以指定相等比较方法
// Count      返回序列中满足指定条件的元素的数量,可以指定条件判断方法
// LongCount      返回序列中满足指定条件的元素的长数量,可以指定条件判断方法
// Cast      将IEnumerable中的元素转换为指定的数据类型
// DefaultIfEmpty      返回序列中指定位置的元素。如果序列为空,则返回默认的元素值
// ElementAt      返回序列中指定索引处的元素
// ElementAtOrDefault      返回序列中指定索引处的元素。如果序列为空,则返回默认值
// First      返回序列中满足指定条件的第一个元素,可以指定条件判断方法
// FirstOrDefault      返回序列中满足指定条件的第一个元素。如果不存在则返回默认值,也可以指定条件判断方法
// Last      返回序列中满足指定条件的最后一个元素,可以指定条件判断方法
// LastOrDefault      返回序列中满足指定条件的最后一个元素。如果不存在则返回默认值,也可以指定条件判断方法
// Single      返回序列中满足指定条件的唯一元素。如果不止一个元素满足条件会引发一场,可以指定条件判断方法
// SingleOrDefault     返回序列中满足指定条件的唯一元素。如果不存在则返回默认值,如果不止一个元素满足条件会引发一场,可以指定条件判断方法
//Reverse     反转序列中元素的顺序
// Distinct     返回序列中不重复的元素的集合,可以指定相等比较方法
// Concat     连接两个序列,直接首尾相连。返回结果可能存在重复数据
// Except     获取两个元素集合的差集,可以指定相等比较方法
// Intersect      获取两个元素集合的交集,可以指定相等比较方法
// Union      获取两个元素集合的并集,可以指定相等比较方法

// SequenceEqual
//    比较两个序列是否相等,可以指定相等比较方法
// Where     根据制定条件对集合中元素进行筛选,返回满足条件的元素集合
// Skip     跳过序列中指定数量的元素,然后返回剩余的元素
// SkipWhile     跳过序列中满足指定条件的元素,然后返回剩余的元素,可以指定条件判断方法
// Take     从序列的开头返回指定数量的连续元素
// TakeWhile     返回从序列开始的满足指定条件的连续元素,可以指定条件判断方法
// ToArray     从IEnumerable<T>创建一个数组
// ToList     从IEnumerable<T>创建一个List<T>

            var sss = s1.Sum();
            foreach (var ss in s1)
            {

                Console.WriteLine(ss);
            }
        }
    }
}

0 Comments:

Post a Comment

<< Home