Linq查询

笔记:


一、LINQ


1,数据源 a,数据库对象,XML流,


   b,实现了IEnumerable 或泛型接口IEnumerable<T>的集合对象


2,语法 var result = from item in list


    where 筛选数据表达式


   (orderby 排序方式)


   select 返回结果集


3,注意必须以from 开头 用 var接收数据系统自己判断数据类型


4,实现类泛型接口IEnumerable<T>的数据源item可以不写数据类型


   而仅仅实现了IEnumerable  item就必须写数据类型Eg:ArrayList


   Eg: var result = from  UserInfo item in arrayList


    where 筛选数据表达式


   (orderby 排序方式)


    select 返回结果集


注:foreach 循环 result 也必须写实际数据类型不能用隐式var


   string其实是一个字符串数组,也可判断筛选(where )


   单个或多个字符词组循环输出




    5,from 子句,假如一个实体类包含了各种属性外还包含了集合


或其他实体类就要用from子句嵌套.假如一个用户实体类包含


了他喜欢的人的集合,以下代码返回关于李冰冰的所有信息


Eg:


var result = from  item in uList


    from lover in item.Lovers


    where lover=="李冰冰"


   (orderby 排序方式)


    select 返回结果集




释:第一个from循环数据源中的所有对象,第二个from循环Lovers集合


    6,where子句,筛选或判断


a,除开始和结尾可用于Linq任何位子


b,逻辑运算符,个别不同于数据库 而是使用 "||","&&","=="


    c,动态谓词赛选   


Eg:
//动态谓词组
string[] loversName={"李冰冰","黄圣依"};


var result = from  item in uList


    from lover in item.Lovers


    where lover.Contains("李冰冰")


    //where lover.IndexOf("李冰冰")>-1


   (orderby 排序方式)


    select 返回结果集


  释:Contains();检查集合数组中是否存在该元素,适用于所有.NET集合与数组


    IndexOf();......同上 有该元素返回下标从0开始无责返回负数


7.select子句,


a,返回结果集,也可进行数据转换(投影)产生的结果取决于前面的数据源和where


b,投影就是把想筛选想要的数据,可以然后把这些数据赋值给任意类型


Eg:


var result = from  item in uList


        from lover in item.Lovers


   where item.Hight>175


       (orderby 排序方式)


          select new NiceManInfo {Hight=item.Hight,Age=item.Age}


释:假如有两个实体类一个实体类的数据全在uList中,然后查询uList中身高大于175的


   人,然后把这些数据全部添加到 NiceManInfo 实体类中。假设NiceManInfo 


   中只有Higeht 和Age两字段


           


8.group 子句,分组


 a, Linq查询 必须以select或group结尾


 b,基于 IGrouping<TKey,TELement> 泛型接口的对象序列


 c,继承关系: IGrouping<TKey,TELement> :IEnumerable<TELement>,IEnumerable


 d,TKey键的数据类型,由编译器推断得出;TELement值得数据类型


 e,键可以有相同的键,一个键下面可以有多个对象值.通过建取值


Eg:


var result = from query in uList


    group query by query.Uname.Substring(0,1)
//取键和值
foreach(IGrouping<string,UserInfo> uGroup in result)


{
Console.WriteLine("键是:"+uGroup );


foreach(var u in uGroup)
{
   Console.WriteLine("姓名:"+uGroup.Uname+"\n年龄:"+uGroup.Uage );
}





释:根据名字的第一个字分组,截取名字的第一个字。自动识别键类型string





     9.into子句   在group select join 中结果引用



     10,orderby 排序子句


默认升序,orderby 字段 descending 降序


     11,join子句


a,用处;比较不同数据源中的属性值


b,用eqals进行相等比较而不是"=="


c,比较之后名字,被比较的一方的被比价属性将被删除



Eg:

namespace Linq
{
    class Program
    {
        static void Main(string[] args)
        {
            List<UserInfo> uList = new List<UserInfo> 
            {
                new UserInfo {Sex="男",Age=12,Uname="张三"},
                new UserInfo {Sex="女",Age=1562,Uname="李四"},
                new UserInfo {Sex="女",Age=152,Uname="周星驰"},
                new UserInfo {Sex="男",Age=120,Uname="张学友"},
                new UserInfo {Sex="男",Age=56,Uname="刘德华"}
            };
            List<jobInfo> jList = new List<jobInfo> 
            {
                new jobInfo{JobName="后端",Uname="张三"},
                new jobInfo{JobName="测试",Uname="李四"},
                new jobInfo{JobName="经理",Uname="李四"},
                new jobInfo{JobName="人事",Uname="周星驰"}
            };
            //1,内连接查询没有职位的人将不会显示出来(只返回两表公共部分)
            var reult = from query in uList
                        join job in jList on query.Uname equals job.Uname 
                        select new { Name = query.Uname, Age = query.Age, jops = job.JobName,Sex=query.Sex };
            foreach (var item in reult.ToList())
            {
                Console.WriteLine(item.Age+"\t"+item.Name+"\t"+item.jops+"\t"+item.Sex);
            }
            Console.WriteLine("分组查询;");
            //2,根据姓名分组连接查询
            //根据名字分组之后将显示每个名字下的所有职务
            //没有职位的将不会显示职位,且只会显示职位和名字两个字段
            //groupList中只有两字段
            //为什么groupList中只有两个字段
            var reult1 = from query in uList
                         //将查询到的数据添加到gropList中
                        join job in jList on query.Uname equals job.Uname into groupList
                        select new { Name = query.Uname, aList=groupList };
            foreach (var item in reult1.ToList())
            {
                Console.Write("姓名:"+item.Name+"\t");
                foreach (var all in item.aList)
                {
                    Console.WriteLine("工作:"+all.JobName);
                }
            }
            //3,为空返回一个字符窜
            Console.WriteLine("\n\n\n左连接查询,无工作的返回空缺二字");
            var result3 = from query in uList
                          join job1 in jList on query.Uname equals job1.Uname into groupList1


                          from gl in groupList1.DefaultIfEmpty()
                          //这里的query.Uname不能用gl.Uname,因其自动识别为jobInfo表,
                          //而经过连表查询jobInof表中的Uname已经被删除了,故会引发异常,左连接会返回左表数据
                          select new { Name = query.Uname, Jobs = (gl == null ? "空缺" : gl.JobName) };
            foreach (var item in result3)
            {
                Console.WriteLine("姓名:" + item.Name + "\t工作:" + item.Jobs);


            }
            //练习扩展右链接???
            Console.ReadKey();
        }
    }

}

运行结果








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值