Linq操作之Except,Distinct,Left Join 【转】
最近项目中用到了Linq中Except,Distinct,Left Join这几个运算,这篇简单的记录一下这几种情形。
Except
基础类型使用Linq的运算很简单,下面用来计算两个集合的差
int[] a = {1, 2, 3, 4};
int[] b = {2, 3, 4, 5};
var reslut = a.Except(b);
result 用来返回a有,b没有的值,计算结果是1。
自定义类型实现Except
class Employee
{
public int ID { get; set; }
}
对于引用类型,若需要根据属性进行Except运算,则看下面简单的例子
List<Employee> employeeA = new List<Employee>() { new Employee { ID = 1 }, new Employee { ID = 2 }};
List<Employee> employeeB = new List<Employee>() { new Employee { ID = 2 }, new Employee { ID = 3 } };
//var reslut = employeeA.Except(employeeB);
var reslut = (from a in employeeA
select a.ID).Except
(from b in employeeB
select b.ID );
对于集合的操作,Linq中还提供了Union,Intersect等常见的几个运算,都是关系数据库中常用的运算
Distinct
Distict是用来排除相同序列中元素的,对于基础类型,可以直接使用Distinct
int[] a = {1, 2, 2, 3, 3, 3, 4};
var reslut = a.Distinct();
结果是1,2,3,4,但是对于自定义类型,则需要额外的一些操作,方式有多种,这里选择其中一种,即实现IEquatable<>
class Employee : IEquatable<Employee>
{
public int ID { get; set; }
public string Name { get; set; }
public bool Equals(Employee other)
{
if (Object.ReferenceEquals(other, null))
return false;
if (ReferenceEquals(this, other))
return true;
return ID.Equals(other.ID);
}
public override int GetHashCode()
{
return ID.GetHashCode();
}
}
这里重写了GetHashCode,Equals根据ID相同过滤对象,看简单的例子
List<Employee> employees = new List<Employee>
{
new Employee {ID = 1, Name = "Ringgo"},
new Employee {ID = 2, Name = "Rex"},
new Employee {ID = 1, Name = "Ringgo"}
};
var reslut = employees.Distinct();
这样就实现了对自定义类型的Distinct操作。
Left Join
Linq查询表达式中提供了join运算,比较常见的是join.. on ..equals,也就是内联接运算
int[] array1 = {1, 2, 3, 4};
int[] array2 = {1, 2,3,5};
var reslut = from a in array1
join i in array2 on a equals i into c
from o in c
select o;
这里要说的是Left Join,这里为了方便,仅列出表达式的语法
var result = from a in employees
join b in _biddingBase
on a.EmployeeId equals b.EmployeeId into temp
from t in temp.DefaultIfEmpty()
select new
{
Name = a.Name,
OrganizationName = a.OrganizaionName,
EmployeeId = a.AgentId,
Id = a.EmployeeId,
OrganizationId = a.OrganizaionId,
DayOffValue = t==null?0:t.DayOffValue,
TimeOffValue = t==null?0:t.TimeOffValue
};
这段代码主要是用到DefaultIfEmpty(),那么在右集合为null时,注意DayOffValue = t==null?0:t.DayOffValue这种语法即可。
如果你对数据库的表的各种联接运算理解的话,我想用LINQ这种语法会更方便。
以上即是这段时间项目中遇到的一些问题,为了之后再遇到这种问题时不必花时间,这里自己把这些问题提取出来,也希望对你有所帮助。
转自:http://www.cnblogs.com/626498301/archive/2011/02/24/1963413.html
Linq操作之Except,Distinct,Left Join 【转】的更多相关文章
- Code First开发系列之管理数据库创建,填充种子数据以及LINQ操作详解
返回<8天掌握EF的Code First开发>总目录 本篇目录 管理数据库创建 管理数据库连接 管理数据库初始化 填充种子数据 LINQ to Entities详解 什么是LINQ to ...
- 8天掌握EF的Code First开发系列之3 管理数据库创建,填充种子数据以及LINQ操作详解
本文出自8天掌握EF的Code First开发系列,经过自己的实践整理出来. 本篇目录 管理数据库创建 管理数据库连接 管理数据库初始化 填充种子数据 LINQ to Entities详解 什么是LI ...
- LINQ操作List<T>
LINQ操作List<T>主要包括: 1.筛选 List<string> stcdList = stcdArray.ToList<string>() .FindAl ...
- LINQ操作数组(交集,并集,差集,最值,平均,去重复)
数组是大学里经常拿来做算法练习的对象.一些经典算法非常有价值,考试.装逼.面试都十分有用.但现在是效率时代,编程讲究生产效率,利用LINQ,可以让程序猿避免写一些基本算法,把精力花在业务处理上. 下面 ...
- Linq操作非泛型集合
我们都知道,Linq能查询泛型集合,确切的说是:LINQ能实现查询泛型对象或者实现了IEnumerable.但是,很遗憾的是诸如ArrayList这样的非泛型集合并没有实现IEnumerable.那咋 ...
- LINQ to SQL语句(4)之Join
适用场景:在我们表关系中有一对一关系,一对多关系,多对多关系等.对各个表之间的关系,就用这些实现对多个表的操作. 说明:在Join操作中,分别为Join(Join查询), SelectMany(Sel ...
- 如何使用linq操作datatable进行分组
使用微软.net的孩子们应该都知道linq吧,要知道linq可是其他高级语言没有的技术,比如php,java等等,但是起初我对linq的认识只是停留在对 list<> 的泛型集合进行操作, ...
- XML系列之--Linq操作带属性的XML(四)
关于XML,之前解析过电文收发方面的,就是所谓的带表头.前缀(命名空间)SOAP格式.这次需求是解析一个xml的模板(xls内容),然后填充数据,最后保存.需要时可转换xls.pdf等文件.关于这种带 ...
- .NET环境下,通过LINQ操作SQLite数据库
//对应数据库中的某个表 [Table(Name = "main.Student")] public class Student { [Column(Na ...
随机推荐
- Reflexil
https://github.com/sailro/Reflexil/issues/47 Instructions on how to install Reflexil would be much a ...
- python MySQLdb连接mysql时报错
故障现象: >>> import MySQLdb >>> conn = MySQLdb.connect(host=,charset="utf8" ...
- 小D课堂 - 新版本微服务springcloud+Docker教程_4-01 常用的服务间调用方式讲解
笔记 第四章 服务消费者ribbon和feign实战和注册中心高可用 1.常用的服务间调用方式讲解 简介:讲解常用的服务间的调用方式 RPC: 远程过程调用,像调用本地 ...
- 关于java面试题
java的优点: Java是一种跨平台,适合于分布式计算环境的面向对象编程语言. 具体来说,它具有如下特性: 简单性.面向对象.分布式.解释型.可靠.安全.平台无关.可移植.高性能.多线程.动态性等.
- python中pip的安装与更新
python -m pip install --upgrade pip --force-reinstall
- c语言求素数以及改进算法
代码需要使用c99编译 #include <stdio.h> #include <stdlib.h> #include <math.h> //是否为素数 //从2到 ...
- DISCUZ论坛各大功能模块入口文件介绍
index.php 首页入口文件,这个文件相信大家都不陌生,小编就不具体介绍了. forum.php 论坛入口文件 portal.php 门户入口文件 group.php 群组入口文件 home.ph ...
- vue项目在(windowServer)nginx上的部署
(一) 本地部署. 1.下载phpStudy (http://phpstudy.php.cn/) 2.安装到自己指定盘根目录的文件夹目录,安装完后会用到. 3.运行phpStusy可能报错,需要下载安 ...
- vue/cli 3.0配置NODE_ENV
原文地址 在项目开发中我们需要配置环境变量,开发环境,生产环境和测试环境.在cli 2.0的版本中我们是通过在config文件夹进行配置的,vue/cli 3.0相对简单,只需要在项目根目录创建.en ...
- curl and wget
写在前面: a. 对比curl 和 wget 的相同和不同点 来记忆 a-1 curl url 直接将请求内容输出到标准输出. 如果下载不是瞬时间完成,会显示下载进度条,如果向取消,加-s : w ...