LINQ语言集成查询

LINQ是VS2008中的一组功能,可为C#提供强大的查询功能。LINQ提供程序的程序集支持将LINQ与.NET Framework集合、SQL Server数据库、ADO.NET数据集和XML文档一起使用。
LINQ提供了一种跨数据源和数据格式的统一模型,实现查询。在LINQ中,可以使用相同的编码模式来查询和转换XML文档、SQL数据库、ADO.NET数据集以及.NET集合中的数据,LINQ的编写其意义类似SQL语句。

关键字说明
from指定范围变量和数据源
where根据bool表达式从数据源中筛选数据
select指定查询结果中的元素所具有的类型或表现形式
group对查询结果按照键/值分组
into提供一个标识符,它可以充当对join、group、或select子句结果的引用
orderby对查询出来的结果进行排序
join按照两个指定匹配条件对等连接两个数据源
left产生一个用于存储子表达式查询结果的范围变量

LINQ的方法语法是非常灵活和重要的,下面用一个案例演示LINQ结合Lambda表达式查询数据集。

class Program
    {
        //定义一个学生类
        public class Student
        {
            public int ID { get; set; }
            public string Name { get; set; }
            public List<int> Scores { get; set; }
        }
        static void Main(string[] args)
        {
            //实例化学生类
            List<Student> students = new List<Student>()
            {
                new Student{ ID=1,Name="张三",Scores=new List<int>{97,98,80,78 } },
                new Student{ ID=2,Name="李四",Scores=new List<int>{85,49,72,83 } },
                new Student{ ID=3,Name="王五",Scores=new List<int>{69,80,85,97 } },
                new Student{ ID=4,Name="马六",Scores=new List<int>{65,89,62,94 } }
            };
            //查询第一门成绩大于70的同学
            IEnumerable<Student> studentQueryone = students.Where(p => p.Scores[0] > 70);
            foreach (var item in studentQueryone)
            {
                Console.WriteLine($"学生姓名:{item.Name}  成绩:{item.Scores[0]}"  );
            }
            Console.WriteLine("------------------------------------------");
            //添加筛选条件
            IEnumerable<Student> studentQuerytwo = students.Where(p => p.Scores[0] > 70 && p.Scores[1]>80);
            foreach (var item in studentQuerytwo)
            {
                Console.WriteLine($"学生姓名:{item.Name}  成绩:{item.Scores[0]}");
            }
            Console.WriteLine("------------------------------------------");
            //对结果进行排序
            IEnumerable<Student> studentQueryth = students.Where(p => p.Scores[0] > 70).OrderBy(p => p.Scores[0]);
            foreach (var item in studentQueryth)
            {
                Console.WriteLine($"学生姓名:{item.Name}  成绩:{item.Scores[0]}");
            }
            Console.WriteLine("------------------------------------------");
            //select投影
            var studentQueryfor = students.Select(p => new { name = p.Name, chengji = (p.Scores[0] + p.Scores[1] + p.Scores[2] + p.Scores[3]) });
            foreach (var item in studentQueryfor)
            {
                Console.WriteLine($"学生姓名:{item.name}  成绩:{item.chengji}");
            }
        }
    }

在上个案例做投影查询总成绩的代码块中,查询总成绩的方法多少有点笨拙,在LINQ查询中页提供了聚合函数操作。比如我们常用到的Count()查询总个数,Max()最大值、Average()平准值等等。

var studentQueryfiv = students.Select(p => new { name = p.Name, chengji = p.Scores.Sum()});
            foreach (var item in studentQueryfiv)
            {
                Console.WriteLine($"学生姓名:{item.name}  成绩:{item.chengji}");
            }

LINQ的元素操作是从一个序列中查询,并返回单个特定的元素常见的执行元素操作运算符如下

方法名说明
Elementat()返回集合中指定索引处的元素
ElementatorDeafult()返回集合中指定索引处的元素,如果索引超出范围则返回默认值
First()返回集合中第一个元素
FirstOrDeafult()返回集合中第一个元素,如果没有返回默认值
Last()返回集合中最后一个元素
LasttOrDeafult()返回集合中最后一个元素,如果没有返回默认值
Single()返回集合中唯一元素
SingleOrDeafult()返回集合中唯一元素,如果没有返回默认值
var data = students.FirstOrDefault();
            Console.WriteLine($"姓名:{data.Name},成绩{data.Scores.Sum()}");

所有元素操作运算返回值的类型均为集合中的元素类型,而非集合类型。所有元素操作都不支持查询语法的方式书写。当使用Elementat() 、First()、Last()、Single()运算时,在操作的集合中元素个数为0时会报错,使用相对应的 ElementatorDeafult()、FirstOrDeafult()、LasttOrDeafult()、SingleOrDeafult()可以避免报错并返回默认值。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值