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 )实体,它保存某个影片什么时候租出及还回来,以及滞纳金等, ...
随机推荐
- js:数据结构笔记10--图和图算法
图:是由边和定点的集合组成: 按照图的定点对是否有序可以分为:有向图和无向图: 路径:所有顶点都由边连接构成:路径长度为第一个定点到最后一个顶点之间的数量: 环:指向自身的顶点,长度为0:圈:至 ...
- 计算几何 2013年山东省赛 A Rescue The Princess
题目传送门 /* 已知一向量为(x , y) 则将它旋转θ后的坐标为(x*cosθ- y * sinθ , y*cosθ + x * sinθ) 应用到本题,x变为(xb - xa), y变为(yb ...
- SplendidCRM 如何添加及使用中文语言包
SplendidCRM 功能很强大,也支持多国语言,但关于中文语言安装的介绍在网上一直都找到,自已摸索了一下,成功使SplendidCRM应用中文,以下是安装方法. 版本号:SplendidCRM 7 ...
- COJ970 WZJ的数据结构(负三十)
WZJ的数据结构(负三十) 难度级别:D: 运行时间限制:1000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给你一棵N个点的无根树,点和边上均有权值.请你设计 ...
- PHP多重判断删除文件函数
<?function delete_file($file) { if (file_exists($file)) { $delete = chmod ($file, ...
- Careercup | Chapter 7
7.4 Write methods to implement the multiply, subtract, and divide operations for integers. Use only ...
- Hadoop配置文件解析
Hadoop源码解析 2 --- Hadoop配置文件解析 1 Hadoop Configuration简介 Hadoop没有使用java.util.Properties管理配置文件, 也没有使 ...
- c#String的不变特性,可读但不可写性
谈到字符串,大家自然觉得简单,但是总是有一些小的问题隐约出现,下面我就系统的说一下字符串的问题,有说不到日后再予补充. 1,首先String是一个类,string只是String类的一个别名,别名的意 ...
- UAPStudio授权过期的解决方法,重新授权
1.启动lisence服务器,生成硬件锁, 并导入授权. 需要注意的地方:1.点击工具栏“帮助”下的“UAP-STUDIO”授权管理. 2.删除“D:\UAP-STUDIO\Platform\bin” ...
- MyBatis+springMVC+easyUI (dataGirl)实现分页
页面展示效果. 页面代码: <%@ page contentType="text/html;charset=UTF-8" language="java" ...