c#的查询表达式

必须支持LINQ, 咦 ~~~~~~~~ 有点像SQL

表达式以: from子句开头,

     select或者group子句结束。

中间可以包含其它句子




 int[] arr = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
 var query = from n in arr //创建一个查询表达式query
              where n > 1 && n < 6
              orderby n % 2 ascending, n descending
              select n;  //  var query = from n in arr select n;
  foreach (var m in query)
        Console.Write(m+"   ");

from子句用来指定查询表达式的数据源和范围变量。 

from子句指定的数据源的类型必须为IEnumerable、IEenumerable<T>或一种派生类型。

泛型的例子:

List<Person> list = ...

var query = from m in list

select u;

当数据源是非泛型IEnumerable类型时,需要显示指定范围变量的类型

ArrayList list = new ArrayList();

list.Add( ... );//添加Person类的实例

。。。

。。

var query = from Person m in list 

select u;


包含多个from子句的查询表达式

int [] arr1 = new int[] {0,1,2,3,4,5,6};

int[] arr2 = new int[] {2,3,34,4,5,6,7};

var query = from a in arr1

from b in arr2

select a+b;


from嵌套的查询表达式

public class tian

{

public string Name; 

public List<string> SecondName;

}

查询

List<PersonInfo> list = ...

var query = from u in list //查询list泛型列表

from name in u.SecondName 

select u.Name + name;


//创建匿名对象

int[] arr = new int {0,1,2,3,4,5};

var query = from n in arr

select new 

{

ID = n,

Name = n.ToString()

};


where 子句

var query = from m in arr

where m < 5 && m >-1

select m;

//

private bool IsEven(int i)//判断i是否为偶数

{

return i%2 == 0? true: false;

}

var query = from m in arr

where IsEven(m)

select m;

let 子句

创建一个新的范围变量,它用于存储子表达式的结果

int[] arr = new int[]{0,1,2,3,4,5,6,7};

var query = from m in arr

let isEven = return n%2 ==0? true:false

where isEven

select n;


orderby 子句

升序 ascending

降序 descending

默认是升序

 var query = from n in arr

where n>1 && n<6

orderby n descending

select n;


group子句 ,用来将查询结果分组,并返回一对象序列。

int [] arr = new int[] {0,1,2,3,4,5,6};

var query = from m in arr

where n>1 && n< 6

group n by n %2; //分成了两个组

查询的结构是一个序列(类型为IEnumerable<IGrouping<int,nit>>),该序列的元素类型为IGrouping<int,int>.

foreach(var g in query) 

{

foreach(var o in g)

{

Console.WriteLine(o);

}

}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace testLINQ
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] arr = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            var query = from n in arr
                        where n > 1 && n < 6
                        group n by n % 2;                      //创建一个查询表达式query

            foreach (var a in query)
            {
                Console.WriteLine("键值为:" + a.Key);       //显示每一个分组的键的值
                foreach (var b in a)
                    Console.Write(b + "   ");
                Console.WriteLine();
            }
            Console.WriteLine();
            Console.ReadLine();
        }
    }
}


into子句

用来创建一个临时标识符,讲group、join或select子句的结果存储到这个标识符中。


var query = from n in arr

where n>1 && n<6

group n by n %2 into g

from sn in g

select sn;

 

join 子句 用来连接两个数据,即设置两个数据源之间的关系

3种联接方式

1,内部联接:元素的联接关系必须同时满足两个数据源,类似于SQL语句中的inner join子句

int[] arra = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            int[] arrb = new int[] { 0, 2, 4, 6, 8 };
            var query = from a in arra
                        where a < 7
                        join b in arrb on a equals b
                        select a;
            foreach (var m in query)
                Console.Write(m+"   ");

/* 首先选择小于7的元素,然后再和arrb数组进行联接,并获取既包含在{0,1,2,3,4,5,6}集合中、又包含在arrb数组中的元素,最终查询表达式的

结果包含4个元素(0,2,4,6)

  */

2,分组联接:包含into子句的join子句。它将左数据源与右数据源的元素依次匹配。左数据源的所有元素都出现在查询结果中。若在右数据源中找到匹配项,则使用匹配的数据,否则用空表示。

 var query = from a in arra
                        where a < 7
                        join b in arrb on a equals b into g
                        select new
                        {
                            ID = a,
                            Values = g
                        }; 



3,左外部联接:元素的联接关系必须满足联接中的左数据源,类似于SQL语句中的left join子句。

join 子句的左外部联接将返回左侧数据源序列中的所有元素,就算它们在右侧序列中没有匹配的元素也是这样。

int[] arra = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            int[] arrb = new int[] { 0, 2, 4, 6, 8 };
            var query = from a in arra
                        where a < 7
                        join b in arrb on a equals b into g
                        from ab in g.DefaultIfEmpty()
                        select ab;                               //创建一个查询表达式query
            foreach (var m in query)
                Console.Write(m+"   ");

 (里面有些 0 是因为 右面没有,所以用的0 代替 )

from ab in g.DefaultIfEmpty() :查询g分组中的每一个元素。如果该分组不存在元素,则返回默认值

如果序列为空,则DefaultIfEmpty()方法返回只包含一个元素的序列,该元素类型的值为默认值

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值