C#中Linq查询基本操作
摘要:本文介绍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>{,,,}},
new Student
{
LastName="xiaozhan",Scores=new List<int>{,,,}},
new Student
{
LastName="xiaolan",Scores=new List<int>{,,,}},
new Student
{
LastName="xiaowan",Scores=new List<int>{,,,}},
};
var query = from stuent in students
from score in stuent.Scores
where score >
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[] == 'a' || w[] == '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;
}
}
例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[]
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作为任何引
用类型的默认值,也可以指定用户定义的默认类型。
equalse 运算符
- join 子句执行同等联接。换句话说,只能基于两个键之间的相等关系进行匹配
- 为了表明所有联接都是相等联接,join子句使用equals关键字而不是==运算符
复合键
- 使用复合键可以测试多个值是否相等
select 关键字 选择
C#中Linq查询基本操作的更多相关文章
- Linq查询基本操作
摘要:本文介绍Linq查询基本操作(查询关键字) - from 子句 - where 子句 - select子句 - group 子句 - into 子句 - orderby 子句 - join 子句 ...
- Linq 查询基本操作
- from 子句 - where 子句 - select子句 - group 子句 - into 子句 - orderby 子句 - join 子句 - let 子句 - 复合from子句 - 在某 ...
- 【总结】LINQ查询基本操作列表
每个LINQ查询都以from子句开始,from子句包括以下两个功能. 指定查询将采用数据源. 定义一个本地变量,表示数据源中单个元素. string[] values = { "中国&quo ...
- 【转】C# 中Linq查询所有上级节点或所有下级节点
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net ...
- C#中Linq查询List与DataTable和Dictionary
查询DataTable返回List List<string> listNation = dtNation.AsEnumerable().Select(d => d.Field< ...
- Rafy 中的 Linq 查询支持(根据聚合子条件查询聚合父)
为了提高开发者的易用性,Rafy 领域实体框架在很早开始就已经支持使用 Linq 语法来查询实体了.但是只支持了一些简单的.常用的条件查询,支持的力度很有限.特别是遇到对聚合对象的查询时,就不能再使用 ...
- Entity Framework 5中应用表值函数进行Linq查询
Entity Framework 5引入了表值函数(Table-Valued Functions TVFs).表值函数的返回类型是一个Table类型,可用在SQL查询语句中.最简单的表值函数,读取客户 ...
- Linq to Sql:N层应用中的查询(上) : 返回自定义实体
原文:Linq to Sql:N层应用中的查询(上) : 返回自定义实体 如果允许在UI层直接访问Linq to Sql的DataContext,可以省去很多问题,譬如在处理多表join的时候,我们使 ...
- Linq to Sql:N层应用中的查询(下) : 根据条件进行动态查询
原文:Linq to Sql:N层应用中的查询(下) : 根据条件进行动态查询 如果允许在UI层直接访问Linq to Sql的DataContext,可以省去很多问题,譬如在处理多表join的时候, ...
随机推荐
- JSP之邮箱检验
首先创建Email类继承Serializable接口以启用其序列化功能,而序列化又是为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性.序列化接口没有方法或字段,仅用于标识可序列化的语义. ...
- 【学习笔记】【C语言】指向结构体的指针
1.指向结构体的指针的定义 struct Student *p; 2.利用指针访问结构体的成员 1> (*p).成员名称 2> p->成员名称 3.代码 #include < ...
- Hibernate中Entity实体类的写法
记录下一个Entity类的写法,方便以后查阅: package com.bupt.auth.entity; import java.util.Date; import javax.persistenc ...
- 济南学习 Day 4 T1 pm
幸运数字(number)Time Limit:1000ms Memory Limit:64MB题目描述LYK 最近运气很差,例如在 NOIP 初赛中仅仅考了 90 分,刚刚卡进复赛,于是它决定使用一些 ...
- iOS网络加载图片缓存策略之ASIDownloadCache缓存优化
iOS网络加载图片缓存策略之ASIDownloadCache缓存优化 在我们实际工程中,很多情况需要从网络上加载图片,然后将图片在imageview中显示出来,但每次都要从网络上请求,会严重影响用 ...
- 运行yum报错Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again
今天给Centos通过rpm -Uvh装了个epel的扩展后,执行yum就开始报错: Error: Cannot retrieve metalink for repository: epel. Ple ...
- Stanford parser:入门使用
一.stanford parser是什么? stanford parser是stanford nlp小组提供的一系列工具之一,能够用来完成语法分析任务.支持英文.中文.德文.法文.阿拉伯文等多种语言. ...
- PHP获取时间日期的多种方法
分享下PHP获取时间日期的多种方法. <?php echo "今天:".date("Y-m-d")."<br>"; ...
- Nginx的平滑重启和平滑升级
一,Nginx的平滑重启如果改变了Nginx的配置文件(nginx.conf),想重启Nginx,可以发送系统信号给Nginx主进程的方式来进行.在重启之前,要确认Nginx配置文件的语法是正确的. ...
- iOS 点击return或者点击屏幕键盘消失
//定义两个文本框 UITextField *textName; UITextField *textSummary; //点击return 按钮 去掉 -(BOOL)textFieldShouldRe ...