• LINQ之查询语法from子句


    LINQ查询基本操作包括以下主要关键字:

    --from子句

    --where子句

    --select子句

    --group子句

    --into子句

    --orderby子句

    --join子句

    --let子句

    LINQ示例:

    //1. data source
    int[] linqTestArray = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    
    //2. query expression
    var query = from linqTest in linqTestArray where linqTest % 2 == 0 select linqTest;
    
    //3. output
    foreach (int i in query)
    {
        Console.WriteLine(i);
    }
    Console.ReadLine();
     
    从上面的例子不难看出,LINQ查询操作包含以下三部分:
    1) 获取数据源,LINQ的数据源必须是实现IEnumerable接口对象集合
    2) 定义查询表达式,类似SQL
    3) 输出查询结果,查询变量只定义了查询命令,并没有执行,而是延迟到foreach执行,当然,我们也可以强制立即执行。
     
    查询表达式语法:
    查询表达式必须满足以下语法规则:
    1)查询必须以from子句开始;
    2) 剩余的查询表达式可以包含0个或多个from,let或where子句;
    3) 查询表达式也可以包含orderby子句,可以是ascending或descending,与SQL不一样的是,升序或降序都必须是单词的全写,而不能用asc或desc
    4) 其后应该跟随一个select或group子句
    5) 其后可以有其他的操作
     
     image
     

    from子句

    对于简单的from子句,其实没什么好讲的,跟我们写SQL文是差不多的。下面着重介绍复合from子句和使用多个from子句执行连接。

    --复合from子句

    当数据源中的每个元素本身就是一个序列,或者数据源中的元素包含序列,此时,我们可以通过复合from子句来访问单个数据源中的集合。

    举个例子,一个班级中的学生是一个序列,每个学生所有的成绩列表又是一个序列,假设我们要查找出所有不及格学生及其不及格的分数,我们可以用以下LINQ查询语句来获取这一列表:

                //定义数据源
                List<Student> students = new List<Student>
                                               {
                                                   new Student{Name = "Terry",Scores = new List<int>{98,88,93,75,82}},
                                                   new Student{Name = "Tina",Scores = new List<int>{85,99,87,93,97}},
                                                   new Student{Name = "Linda",Scores = new List<int>{57,100,83,89,92}},
                                                   new Student{Name = "Leon",Scores = new List<int>{100,98,72,77,84}},
                                                   new Student{Name = "Echo",Scores = new List<int>{79,80,97,55,88}}
                                               };
                //定义查询表达式,找出不及格的学生及其分数
                var scoreQuery = from student in students
                                 from score in student.Scores
                                 where score < 60
                                 select new {student.Name, score};
    
                //输出结果
                foreach (var query in scoreQuery)
                {
                    Console.WriteLine("Student:{0} Score:{1}",query.Name,query.score);
                }

    NOTE: 定义数据源的部分采用了对象/集合初始化器,不熟悉的朋友可以参照LINQ学前准备之对象集合初始化器

    我们着重来看一下查询表达式

    首先,我们从students这个数据源中进行查询,student为范围变量,代表每一个student,然后,我们将该范围变量的Scores又作为第二个from的数据源,查找出其值<60的那些score。

    查询出来的结果为:

    image

    --使用多个from子句执行连接

    使用多个from子句连接查询,可以从多个独立的数据源生成补充查询。类似于SQL的join,当然,LINQ也有join语法,他跟多个from的连接语法上是不一样的,我们稍后会介绍join子句。

    假设我们有一个Category集合,还有一个Product集合,Product是属于某个Category的,为了获取Category下所有的Product,我们可以定义如下查询:

                List<Category> categories = new List<Category>
                                                {
                                                    new Category{Id = 1,Name = "Food"},
                                                    new Category{Id = 2,Name = "Toys"},
                                                    new Category{Id = 3,Name = "Fruit"}
                                                };
                List<Product> products = new List<Product>
                                             {
                                                 new Product{ProductId = 201,ProductName = "Chuckit",CategoryId = 2},
                                                 new Product{ProductId = 202,ProductName = "SafeMade",CategoryId = 2},
                                                 new Product{ProductId = 101,ProductName = "Taste",CategoryId = 1},
                                                 new Product{ProductId = 102,ProductName = "Canidae",CategoryId = 1},
                                                 new Product{ProductId = 103,ProductName = "Flavor",CategoryId = 1}
    
                                             };
    
                var productList = from category in categories
                                  from product in products
                                  where product.CategoryId == category.Id
                                  select new {category.Name, product.ProductName};
    
                foreach (var product in productList)
                {
                    Console.WriteLine("{0}----{1}",product.Name,product.ProductName);
                }

    我们得到的结果为:

    image

    在这个例子中,我们通过2个数据源categories和products进行查询,并按照categoryid进行连接。

    由于Fruit这个Category下没有产品,因此没有被查找出来。

    需要跟SQL区分开来的是,这里用的是C#的语法,因此做对等比较的时候应该用”==”而不是”=”。

    To be continue…

    参考:webcast《跟我一起学Visual Studio 2008系列课程》

  • 相关阅读:
    Python 第四十九章 css 补充
    Python 第四十八章 css样式
    Python 第四十七章 css介绍
    iOS 流媒体 基本使用 和方法注意
    iOS 展示 gif
    iOS UIImage UIImageView 展示图片 不变形 处理
    UIImageView 获取图片的 宽 高
    iOS tabbar 上面更换任意图
    iOS 屏幕原点坐标 && 导航栏风格的自定义
    iOS NSDateFormatter 不安全线程 处理
  • 原文地址:https://www.cnblogs.com/tian2010/p/2390709.html
Copyright © 2020-2023  润新知