C#中Linq查询基本操作使用实例

时间:2023-11-25 00:25:37 

摘要:本文介绍Linq查询基本操作(查询关键字)

- from 子句

- where 子句

- select子句

- group 子句

- into 子句

- orderby 子句

- join 子句

- let 子句

- 复合from子句

- 在某些情况下,源序列中的每个元素本身可能是序列(集合),也可能包含序列

- 用语访问单个数据库中的内部集合

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

- 可以包含多个可从独立数据源生成补充查询的from字句

复合(顾名思义就是有多from的字句)实例:


class Program
{ static void Main(string[] args)
    {
        List<Student> students = new List<Student> { new Student
            {
                LastName="xiaogui",Scores=new List<int>{97,42,91,60}}, new Student
                {
                    LastName="xiaozhan",Scores=new List<int>{50,92,81,60}}, new Student
                    {
                        LastName="xiaolan",Scores=new List<int>{32,32,81,90}}, new Student
                        {
                            LastName="xiaowan",Scores=new List<int>{92,22,81,60}},        
        }; var query = from stuent in students from score in stuent.Scores where score > 90 select new {
                        Last = stuent.LastName,
                        score
                    }; foreach (var student in query)//大于90分的显示出来   {
            Console.WriteLine("{0} Score:{1}", student.Last, student.score);
        }
        Console.ReadLine();
    }
}


public class Student
{ public string LastName { get; set; } public List<int> Scores { get; set; }
} public class Employee
{ public string First { get; set; } public string Last { get; set; } public int ID { get; set; }
}

执行结果: xiaogui Score:97

              xiaogui Score:91

              xiaozhan Score:92

              xiaowan Score:92

let 关键字(使用let字句扩展范围变量)

- 创建一个可以查询自身的可枚举类型

- 使查询只能对范围变量word调用一次ToLower。

如果不使用let,则必须在where字句的每个谓词中调用ToLower

例:把每个单词开头包含a或者e的找出来


using System; using System.Linq; public class Test
{ static void Main(string[] args)
    { string[] strings = { "A penny saved is a penny earned.", "The aaxly sdj", "the pa is no" }; var query = from sentence in strings
                    let words = sentence.Split(' ')//用空格分割成数组  from word in words
                    let w = word.ToLower()//把每个字母小写  where w[0] == 'a' || w[0] == 'e' select word; foreach (var s in query)
        {
            Console.WriteLine(s);
        }
        Console.ReadLine();
    }
}

where 关键字 (筛选)

- 一个查询表达式可以包含多个where字句

例:(把包含a的找出来)


using System; using System.Linq; public class Test
{ static void Main(string[] args)
    { string[] str = { "a", "b", "c" }; var query = from s in str where s == "a" select s; foreach (var s in query)
        {
            Console.WriteLine(s);
        }
        Console.ReadLine();
    }
}

orderby 关键字 (排序)

- 在查询表达式中,orderby字句可以使返回的序列(组)按升序或降序。

- 可以指定多个键,以便执行一个或多个次要排序操作

- 默认排序顺序为升序

- 编译时,orderby字句被转换为对OrderBy方法的调用。orderby字句中的多个键被转换为ThenBy方法调用

descending 降序

ascending 升序

例1:升序


using System; using System.Linq; public class Test
{ static void Main(string[] args)
    { string[] str = { "a", "b", "c" }; var query = from s in str orderby s ascending select s;
    }
}

结果为: a b c

例2:降序


using System; using System.Linq; public class Test
{ static void Main(string[] args)
    { string[] str = { "a", "b", "c" }; var query = from s in str orderby s descending select s;
    }
}

结果为: c b a

group 关键字 (分组)

- group 字句返回一个IGrouping(TKey,Telement)对象序列 

- 编译时,group子句被转换为对GroupBy方法的调用

(LINQ查询表达式可以以select或者Group结束) (如果想要对每个组执行附加查询操作,则可以使用into上下文关键字指定一个临时标识符,使用into时,必须继续编写该查询,并最终用一个select语句或另一 个group子句结束该查询)

例:


using System; using System.Linq; public class Test
{ static void Main(string[] args)
    { string[] str = { "aa", "bb", "cc", "dd" }; var query = from s in str
                    group s by s[0]
                        into p where p.Key == 'a' || p.Key == 'b' || p.Key == 'c' orderby p.Key descending select p.Key; foreach (var s in query)
        {
            Console.WriteLine(s);
        }
        Console.ReadLine();
    }
}


结果为: c b a

说明: group s by s[0] into p 意思是针对范围变量s用“s[0]”分组,本例中是用第一个字母分组

join 关键字 (联接)

- 使用join 子句可以将来自不同源序列并且在对象模型中没有直接关系的元素相关联

- 唯一的要求是每个源中的元素需要共享某个可以进行比较以判断是否相等的值

- join字句使用特殊的equals关键字比较指定的键是否相等

三中常见的连接类型

- 内部联接

- 分组联接

- 左外部联接

1.内部联接


var query = from a in str
join b in str2 on a.id equals b.id select new { Aname = a.name, Bname = b.name };


2.分组联接:(into 可以将join暂存起来)


var query = from a in str
join b in str2 on a.id equals b.id
into c select new {Aname=a.name,Cs=c}

3.左外部联接

- 在左外部联接中,将返回左则源序列中所有元素,即使它们在右则序列中没有匹配的元素也是如此。

- 若要在LINQ中执行左外部联接,请将DefaultifEmpty方法与分组联接结合起来,以指定要在某个左则元素不具有匹配元素时产生的默认右则元素。可以使用null作为任何引

用类型的默认值,也可以指定用户定义的默认类型。


var query = from category in categories
join prod in products on category.id equals prod.CategoryID
into prodGroup from item prodGroup.defaultifEmpty( new Product{Name=string.empty,CategoryID=0}) select new {CatName=category.Name,ProdName=item.Name}

equalse 运算符

- join 子句执行同等联接。换句话说,只能基于两个键之间的相等关系进行匹配

- 为了表明所有联接都是相等联接,join子句使用equals关键字而不是==运算符

复合键

- 使用复合键可以测试多个值是否相等

select 关键字 选择

标签:Linq查询,基本操作
0
投稿

猜你喜欢

  • Java Web开发过程中登陆模块的验证码的实现方式总结

    2022-01-29 19:33:16
  • Spring异常捕获且回滚事务解决方案

    2023-04-25 18:32:41
  • Unity实现滑动更换界面效果

    2021-10-06 19:56:40
  • Java数据结构之栈与队列实例详解

    2021-05-29 03:25:13
  • Java使用TCP实现在线聊天的示例代码

    2021-10-16 23:49:53
  • Eureka源码阅读之环境搭建及工程结构

    2023-07-26 01:02:36
  • 实例讲解JAVA设计模式之备忘录模式

    2023-08-29 16:31:19
  • java Spring的启动原理详解

    2022-09-02 04:39:59
  • Android中的常用尺寸单位(dp、sp)快速入门教程

    2023-09-19 08:59:08
  • Android自定义StepView仿外卖配送进度

    2022-07-30 01:34:35
  • Java 二分法检索算法代码实现详解

    2022-01-05 19:13:24
  • 如何使用C#将Tensorflow训练的.pb文件用在生产环境详解

    2023-02-12 21:25:59
  • 再议C#中的装箱与拆箱的问题详解

    2022-09-30 03:45:40
  • c#的dllimport使用方法详解

    2023-04-20 04:01:49
  • jdk15的安装与配置全过程记录

    2023-01-06 05:45:10
  • logback输出日志屏蔽quartz的debug等级日志方式

    2023-08-04 23:40:04
  • Java编程用栈来求解汉诺塔问题的代码实例(非递归)

    2023-01-13 21:41:25
  • C#中一个高性能异步socket封装库的实现思路分享

    2023-12-01 15:20:45
  • android仿微信支付宝的支付密码输入框示例

    2023-09-27 22:11:47
  • 详解C#如何实现屏幕放大和取色功能

    2022-04-15 04:00:37
  • asp之家 软件编程 m.aspxhome.com