Linq&Lumbda
var y = from model in list.Where(s=>s.product==product||product=="")
select new { sn = model.sn };
==========>>
var y = from model in list
where (monthly == "" || m.monthly == monthly) && (product == "" || model.product == product) && (factory == "" || model.factory == factory)
select new { sn = model.sn };
1.简单用法
说明:当以select结尾时表示的只是一个声明或者一个描述,并没有真正把数据取出来,只有当你需要该数据的时候,它才会执行这个语句,这就是延迟加载(deferred loading)。
var query = from student in students select student.Name;
foreach (var student in query) {
Console.WriteLine("{0}", student);
}
2.匿名类型形式
说明:其实质是编译器根据我们自定义产生一个匿名的类来帮助我们实现临时变量的储存。例如 var ob = new {Name = "Harry"},编译器自动产生一个有property叫做Name的匿名类,然后按这个类型分配内存,并初始化对象。
查询学生的姓名:
var query = from student in students
select new { newName = "学生姓名:" + student.Name };
foreach (var student in query) {
Console.WriteLine(student.newName);
}
3.条件形式
说明:三元运算,类似于SQL语句case when condition then else的用法。
查询学生的分数等级:
var query = from student in students
select new { student.Name, level = student.Score < 60 ? "不及格" : "合格" };
foreach (var student in query) {
Console.WriteLine("{0}:{1}", student.Name, student.level); //Terry:不及格 //AI:及格 //AI:及格
}
4.筛选形式
说明:结合where用起到过滤的作用。
var query = from student in students
where student.Name == "Terry"
select student;
5.嵌套类型形式
说明:如果一个数据源里面又包含了一个或多个集合列表,那么应该使用复合的select子句来进行查询。
class Student {
public string Name { get; set; }
public List<int> Scores { get; set; }
}
List<Student> students = new List<Student>{
new Student {Name="Terry", Scores=new List<int> {97, 72, 81, 60}},
new Student {Name="AI", Scores=new List<int> {75, 84, 91, 39}},
new Student {Name="Wade", Scores=new List<int> {88, 94, 65, 85}},
new Student {Name="Tracy", Scores=new List<int>{97, 89, 85, 82}},
new Student {Name="Kobe", Scores=new List<int> {35, 72, 91, 70}}
};
var query = from student in students
select new { student.Name, //生成新的集合对象
highScore=from sc in student.Scores
where sc>80
select sc
};
foreach (var student in query) {
Console.Write("{0}:",student.Name);
foreach (var scores in student.highScore) { Console.Write("{0},",scores); }
Console.WriteLine();
}
6.本地方法调用形式
var query = from student in students
select new
{
student.Name,
//调用GetLevel方法
level = GetLevel(student.Score)
};
foreach (var student in query)
{
Console.WriteLine("{0}:{1}", student.Name, student.level);
}
protected static string GetLevel(int score)
{
if (score > 60)
{
return "及格";
}
else
{
return "不及格";
}
}
7.Distinct形式
var query = (from student in students
select student.Name).Distinct();
foreach (var student in query)
{
Console.WriteLine("{0}", student);
//Terry:
//AI
}
8.OrderBy
var query = from student in students
orderby student.Score descending, student.Name
select student;
9.Group By
(1)说明:group子句返回一个 IGrouping<TKey, TElement> 对象序列,这些对象包含零个或更多个与该组的键值匹配的项。 例如,可以按照每个字符串中的第一个字母对字符串序列进行分组。 在这种情况下,第一个字母是键且具有 char 类型,并且存储在每个 IGrouping<TKey, TElement> 对象的Key属性中。
var query = from student in students
group student by student.Score;
foreach (var studentGroup in query)
{
//studentGroup推断为IGrouping<int,Student>类型
Console.WriteLine("{0}", studentGroup.Key);
}
(2)说明:由于 group 查询产生的 IGrouping<TKey, TElement> 对象实质上是列表的列表,因此必须使用嵌套的 foreach 循环来访问每一组中的各个项。 外部循环用于循环访问组键,内部循环用于循环访问组本身中的每个项。组可能具有键,但没有元素。如果您想要对每个组执行附加查询操作,则可以使用 into 上下文关键字指定一个临时标识符。 使用 into 时,必须继续编写该查询,并最终用一个 select 语句或另一个 group 子句结束该查询。
var query = from student in students
group student by student.Score into g
select g;
foreach (var studentGroup in query)
{
Console.WriteLine("分数组:{0}", studentGroup.Key);
foreach (var student in studentGroup)
{
Console.Write("{0}:{1},", student.Name,student.Score);
}
Console.WriteLine();
}
10.内部联接
说明:"内部联接"产生一个结果集,对于该结果集内第一个集合中的每个元素,只要在第二个集合中存在一个匹配元素,该元素就会出现一次。 如果第一个集合中的某个元素没有匹配元素,则它不会出现在结果集内。
查询学生的选课信息:
var query = from student in students
join cour in cours on student.Id equals cour.CourseId
select new
{
Id = student.Id,
Name = student.Name,
CourName = cour.CourseName
};
foreach (var student in query)
{
Console.WriteLine("{0} {1} {2}", student.Id, student.Name, student.CourName);
}
11.分组联接
说明:含有 into 表达式的 join 子句称为分组联接。分组联接本质上是一个对象数组序列,结果序列会组织为多个组形式数据进行返回就是会产生一个分层的结果序列。通俗点讲此序列第一个集合中的每个元素与第二个集合中的一组相关元素进行配对,如果找不到就返回空数组。我的理解是分组联接和内部联接基本差不多。
查询学生的选课信息:
var query = from student in students
join cour in cours on student.Id equals cour.CourseId into courseGroup
select new
{
Id = student.Id,
Name = student.Name,
CourInfo = courseGroup
};
foreach (var student in query)
{
Console.Write("{0} {1} ",student.Id,student.Name);
foreach (var cour in student.CourInfo)
{
Console.Write("{0}", cour.CourseName);
}
Console.WriteLine();
//C03 Terry PHP应用开发
//C03 James PHP应用开发
//C01 Kobe C#课程设计
//C02 AI Java深入
//C01 Wade C#课程设计
//C05 Kelly
//注意:C05没有匹配,但是返回空的数组
}
12.左外部联接
说明:在左外部联接中,将返回左侧源序列中的所有元素,即使它们在右侧序列中没有匹配的元素也是如此。 可以使用 LINQ,通过对分组联接的结果调用 DefaultIfEmpty 来执行左外部联接。
查询学生的选课信息:
var query = from student in students
join cour in cours on student.Id equals cour.CourseId into courseGroup
from stucour in courseGroup.DefaultIfEmpty()
select new
{
Id=student.Id,
Name = student.Name,
Cour = courseGroup
};
foreach (var student in query)
{
Console.Write("{0} {1} ", student.Id, student.Name);
foreach (var cour in student.Cour)
{
Console.Write("{0}",cour.CourseName);
}
Console.WriteLine();
}
13.聚合函数
说明:函数有很多,这里只介绍几个:Count、Max、Average、First。
查询学生的人数:
int count = (from student in students
select student.NumId).Count();
Console.WriteLine("学生的人数:{0}", count);
//学生的人数:6
查询最高分:
int maxscore = (from student in students
select student.Score).Max();
Console.WriteLine("最高分:{0}", maxscore);
//最高分:90
查询平均分:
double average = (from student in students
select student.Score).Average();
Console.WriteLine("平均分:{0}", average);
//平均分:68.3333333333333
返回列表第一个学生姓名:
string Name = (from student in students
select student.Name).First();
Console.WriteLine("返回列表第一个学生姓名:{0}", Name);
14.生成结果集
说明:只有使用ToList 或 ToArray 等方法来强制转换,才能使变量立即获取结果集。
转换为List集合:
var querylist = (from student in students
select student).ToList();
foreach (var student in querylist)
{
Console.WriteLine("{0} {1} {2}", student.NumId, student.Name, student.Score);
//3 Terry 55
//1 AI 80
//3 Kobe 40
//8 James 90
//5 Love 60
//6 Wade 85
//注意:变量querylist已经存储结果集
}
转换为Array数组:
var queryarray = (from student in students
select student).ToArray();
foreach (var student in queryarray)
{
Console.WriteLine("{0} {1} {2}", student.NumId, student.Name, student.Score);
//3 Terry 55
//1 AI 80
//3 Kobe 40
//8 James 90
//5 Love 60
//6 Wade 85
//注意:变量queryarray已经存储结果集
}
http://www.cnblogs.com/ForEvErNoME/archive/2012/07/25/2606659.html
http://www.cnblogs.com/ForEvErNoME/archive/2012/08/21/2633767.html
Linq&Lumbda的更多相关文章
- Linq&Lumbda (2)
"Lambda表达式"是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式树类型. Lambda 运算符: => 该运算符读为"goes to&quo ...
- Linq表达式、Lambda表达式你更喜欢哪个?
什么是Linq表达式?什么是Lambda表达式? 如图: 由此可见Linq表达式和Lambda表达式并没有什么可比性. 那与Lambda表达式相关的整条语句称作什么呢?在微软并没有给出官方的命名,在& ...
- Linq之旅:Linq入门详解(Linq to Objects)
示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...
- [C#] 走进 LINQ 的世界
走进 LINQ 的世界 序 在此之前曾发表过三篇关于 LINQ 的随笔: 进阶:<LINQ 标准查询操作概述>(强烈推荐) 技巧:<Linq To Objects - 如何操作字符串 ...
- [C#] 进阶 - LINQ 标准查询操作概述
LINQ 标准查询操作概述 序 “标准查询运算符”是组成语言集成查询 (LINQ) 模式的方法.大多数这些方法都在序列上运行,其中的序列是一个对象,其类型实现了IEnumerable<T> ...
- LINQ to SQL语句(7)之Exists/In/Any/All/Contains
适用场景:用于判断集合中元素,进一步缩小范围. Any 说明:用于判断集合中是否有元素满足某一条件:不延迟.(若条件为空,则集合只要不为空就返回True,否则为False).有2种形式,分别为简单形式 ...
- .NET深入实战系列—Linq to Sql进阶
最近在写代码的过程中用到了Linq查询,在查找资料的过程中发现网上的资料千奇百怪,于是自己整理了一些关于Linq中容易让人困惑的地方. 本文全部代码基于:UserInfo与Class两个表,其中Cla ...
- LINQ Group By操作
在上篇文章 .NET应用程序与数据库交互的若干问题 这篇文章中,讨论了一个计算热门商圈的问题,现在在这里扩展一下,假设我们需要从两张表中统计出热门商圈,这两张表内容如下: 上表是所有政区,商圈中的餐饮 ...
- Entity Framework 6 Recipes 2nd Edition(11-9)译 -> 在LINQ中使用规范函数
11-9. 在LINQ中使用规范函数 问题 想在一个LINQ查询中使用规范函数 解决方案 假设我们已经有一个影片租赁(MovieRental )实体,它保存某个影片什么时候租出及还回来,以及滞纳金等, ...
随机推荐
- javascript优化--01高质量编码
javascript的浮点数: Javascript的数字都是双精度浮点数: 64位编码数字: 能表达53位精度的整数: 进行位运算时会隐式地转化为32位整数(0,1序列)后计算: 浮点数运算可能会有 ...
- SecureCrt自动化
Crt自动化 测试 SecureCrt脚本 JS脚本 引言 软件介绍 脚本介绍 引言 在嵌入式公司中,面对大量的网络设备,不论开发同事进行设备开发.测试同事进行大量测试工作还是运维人员进行大量设备 ...
- linux系统tomcat启动正常访问不到主页面
环境: linux系统 tomcat 6.0.24 jdk 1.6 防火墙的问题: 查看防火墙命令:chkconfig --list | grep -i iptables 关闭防火墙命令:/sbin/ ...
- _jobdu_1384:二维数组中的查找
/************************************************************************/ /* 题目描述: 在一个二维数组中,每一行都按照从 ...
- hdu-acm stepsHumble Numbers
这是我做的第六道动态规划水题,对动态规划差不多有了一个大致的概念.动态规划有几个关键因素,第一是最优子结构,第二是状态和状态转移方程.整个过程都是以 最优 为中心的.因此在状态转移方程中常涉及到几 ...
- IP地址在数据库里面的存储方式
大多数公司的表结构都需要经过DBA进行审核,有时候你会看到存储IP地址采用varchar(15),这种方式都是传统的做法,这种方法需要占用15个字节,那么有更省空间的做法么?肯定是有的,那就是用int ...
- 服务器文件系统一定要用NTFS格式。
网络中心通过ADSL接入Internet(固定的IP地址), 网站服务通过端口映射放到了内网的两台计算机上,一台IP地址为122.9.6.1,提供Web.FTP.POP3与SMTP服务:另一台IP地址 ...
- PHP == 和 ===
== 只判断两边的值是否相等,例如: 5555 == "5555" ,为真 === 判断两边的值和类型是否相当,5555 === "5555" False,因 ...
- Scrum会议4(Beta版本)
组名:天天向上 组长:王森 组员:张政.张金生.林莉.胡丽娜 代码地址:HTTPS:https://git.coding.net/jx8zjs/llk.git SSH:git@git.coding.n ...
- 【收集】JAVA多文件 上传文件接口代码 -兼容app
原文:http://www.verydemo.com/demo_c143_i23854.html 我们在 multifile 中可以很容易的发现如何使用,这里就简单说说了,首先在页面上我们需要有这样几 ...