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
}

  

  


  

posted @ 2020-07-07 18:34  梁仕博  阅读(331)  评论(0编辑  收藏  举报