zoukankan      html  css  js  c++  java
  • linq的简单使用

    1、linq是什么
      linq是c#语言的一个扩展,可以将数据查询直接集成到编程语言本身中。目的就是提供了一种可移式的、一致的方式,来查询 、排序和分组许多不同种类的数据(XML、JSON、SQL数据库、对象集合、Web服务、企业目录等)。

    2、设置数据源

    private class Student 
    {
        public string Name { get; set; }
    
        public string Subject { get; set; }
    
        public int Scores { get; set; }
    }
    

     上面的代码定义对象类型,下面代码声明对象列表并生成数据,后面linq查询使用的数据源默认都是此数据源。

    var studentList = new List<Student>();
    studentList.Add(new Student() { Name = "张三", Subject = "数学", Scores = 28 });
    studentList.Add(new Student() { Name = "张三", Subject = "语文", Scores = 43 });
    studentList.Add(new Student() { Name = "张三", Subject = "英语", Scores = 87 });
    studentList.Add(new Student() { Name = "李四", Subject = "数学", Scores = 45 });
    studentList.Add(new Student() { Name = "李四", Subject = "语文", Scores = 56 });
    studentList.Add(new Student() { Name = "李四", Subject = "英语", Scores = 28 });
    studentList.Add(new Student() { Name = "王五", Subject = "数学", Scores = 43 });
    studentList.Add(new Student() { Name = "王五", Subject = "语文", Scores = 57 });
    studentList.Add(new Student() { Name = "王五", Subject = "英语", Scores = 78 });
    

    3、基础查询

    // Linq查询
    var result =
        from item in studentList    // 声明临时变量item,并说明其为对象列表studentList中的元素
        where item.Scores >= 60      // 筛选成绩不小于60的对象
        select item;        // 将查询结果(item)添加到result中
    // 遍历Linq查询结果,实际上是“Linq查询”是伴随foreach执行的,即在foreach执行前“Linq查询”不会执行
    foreach (var model in result)  //延迟执行
    {
        Console.Write(model.Scores+" ");  //输出87 78 
    }
    

    4、查询排序

    var result =
        from item in studentList
        where item.Scores >= 40 
        orderby item.Subject,item.Scores descending   //先按照科目排序,再按照成绩倒序排序
        select item;       
    foreach (var model in result)
    {
        Console.Write(model.Subject + model.Scores+" ");  //输出数学45 数学43 英语87 英语78 语文56 语文56 语文43 
    }
    

    5、类型转换

    var result =
        from item in studentList
        where item.Scores >= 40 
        orderby item.Subject,item.Scores descending
        select new { item.Subject, item.Scores }; //将student对象转换成一个新的匿名对象    
    foreach (var model in result)
    {
        Console.Write(model.Subject + model.Scores + " ");  //输出数学45 数学43 英语87 英语78 语文56 语文56 语文43 
    }
    

    6、拓展方法

    var result =
        from item in studentList
        select item.Scores;
    Console.Write(result.Count());//获取列表的数量,输出9
    Console.Write(result.Max());//获取最大的值,输出87
    Console.Write(result.Min());//获取最小的值,输出28
    Console.Write(result.Average());//获取平均值,输出51.55
    Console.Write(result.Sum());//获取和,输出464
    Console.Write(result.First());//获取第一个值,输出28
    Console.Write(result.Last());//获取最后一个值,输出78
    foreach (var v in result.Distinct()) { Console.Write(v+" "); }//获取去重后的值,输出 28 43 87 45 56 78 
    

    7、分组

    var result =
        from itemList in studentList
        group itemList by itemList.Name;//根据名称作为键值,itemList为根据键值生成的对象集合
    var queryResult = from item in result//二次加工,此时result.ToList().Count()等于3,为什么要toList呢,再次强调,result只是一段查询语句
                        let nameScores = Name + item.Sum(v => v.Scores) //使用let定义临时变量
                        let Space = " "//使用let定义临时变量
                        select nameScores + Space;
    foreach (var model in queryResult)
    {
        Console.Write(model);//输出 张三158 李四129 王五177
    }

    8、join
      linq中的join都是inner join,可以通过代码实现left join 和 right join 的效果,这里我们举一下inner join和left join 的栗子。首先,我们需要引入一个新的数据源,如下所示:

    private class Suggestions
    {
        public string StudentName { get; set; }
        public string Suggestion { get; set; }
        public string CreatedBy { get; set; }
    }
    var suggestionList = new List<Suggestions>();
    suggestionList.Add(new Suggestions { StudentName="张三",Suggestion="数学语文有待提高",CreatedBy="张老师"});
    suggestionList.Add(new Suggestions { StudentName="李四",Suggestion="所有科目有待提高",CreatedBy="李老师"});
    //suggestionList.Add(new Suggestions { StudentName="王五",Suggestion="语文加油争取及格",CreatedBy="张老师"});
    

      然后我们再通过linq,将studentList包装一下

    var groupResult = from itemList in studentList
                    group itemList by itemList.Name into tempGroup //获取分组数据
                    select new { Name = tempGroup.Key, Scores = tempGroup.Sum(v => v.Scores) };
    

      inner join

    var result = from stu in groupResult
                    join sug in suggestionList on stu.Name equals sug.StudentName //关联评价列表,
                    select new { stu.Name, stu.Scores, sug.Suggestion, sug.CreatedBy };
    foreach (var model in result)
    {
        Console.Write(model.Name + model.Scores + model.Suggestion + model.CreatedBy);
        //输出 张三158数学语文有待提高张老师 李四129所有科目有待提高李老师
    }
    

      left join

    var leftResult = from stu in groupResult
                        join sug in suggestionList on stu.Name equals sug.StudentName into tempResult
                        from tempSug in tempResult.DefaultIfEmpty()//关联评价列表,
                        select new { stu.Name, stu.Scores, tempSug?.Suggestion, tempSug?.CreatedBy };
    foreach (var model in leftResult)
    {
        Console.Write(model.Name + model.Scores + model.Suggestion + model.CreatedBy);
        //输出 张三158数学语文有待提高张老师 李四129所有科目有待提高李老师 王五177
    }
    

      

      


      

  • 相关阅读:
    游戏开发人员眼中的Unity 3D网页游戏測评报告
    MQTT---HiveMQ源代码具体解释(八)Netty-WebSocket
    RGB 与 (RGB转 YCbCr再转为 RGB)的图像
    Shader的语法
    10种软件开发中 over-engineering 的错误套路
    LeetCode——Min Stack
    nyist 82迷宫寻宝(一)(BFS)
    云计算生态系统
    Linux 查看CPU信息、机器型号等硬件信息
    学习新技术的10个建议
  • 原文地址:https://www.cnblogs.com/liangshibo/p/13258353.html
Copyright © 2011-2022 走看看