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
    }
    

      

      


      

  • 相关阅读:
    grunt in webstorm
    10+ Best Responsive HTML5 AngularJS Templates
    响应式布局
    responsive grid
    responsive layout
    js event bubble and capturing
    Understanding Service Types
    To add private variable to this Javascript literal object
    Centering HTML elements larger than their parents
    java5 新特性
  • 原文地址:https://www.cnblogs.com/liangshibo/p/13258353.html
Copyright © 2011-2022 走看看