最近项目中用到了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 【转】的更多相关文章

  1. Code First开发系列之管理数据库创建,填充种子数据以及LINQ操作详解

    返回<8天掌握EF的Code First开发>总目录 本篇目录 管理数据库创建 管理数据库连接 管理数据库初始化 填充种子数据 LINQ to Entities详解 什么是LINQ to ...

  2. 8天掌握EF的Code First开发系列之3 管理数据库创建,填充种子数据以及LINQ操作详解

    本文出自8天掌握EF的Code First开发系列,经过自己的实践整理出来. 本篇目录 管理数据库创建 管理数据库连接 管理数据库初始化 填充种子数据 LINQ to Entities详解 什么是LI ...

  3. LINQ操作List<T>

    LINQ操作List<T>主要包括: 1.筛选 List<string> stcdList = stcdArray.ToList<string>() .FindAl ...

  4. LINQ操作数组(交集,并集,差集,最值,平均,去重复)

    数组是大学里经常拿来做算法练习的对象.一些经典算法非常有价值,考试.装逼.面试都十分有用.但现在是效率时代,编程讲究生产效率,利用LINQ,可以让程序猿避免写一些基本算法,把精力花在业务处理上. 下面 ...

  5. Linq操作非泛型集合

    我们都知道,Linq能查询泛型集合,确切的说是:LINQ能实现查询泛型对象或者实现了IEnumerable.但是,很遗憾的是诸如ArrayList这样的非泛型集合并没有实现IEnumerable.那咋 ...

  6. LINQ to SQL语句(4)之Join

    适用场景:在我们表关系中有一对一关系,一对多关系,多对多关系等.对各个表之间的关系,就用这些实现对多个表的操作. 说明:在Join操作中,分别为Join(Join查询), SelectMany(Sel ...

  7. 如何使用linq操作datatable进行分组

    使用微软.net的孩子们应该都知道linq吧,要知道linq可是其他高级语言没有的技术,比如php,java等等,但是起初我对linq的认识只是停留在对 list<> 的泛型集合进行操作, ...

  8. XML系列之--Linq操作带属性的XML(四)

    关于XML,之前解析过电文收发方面的,就是所谓的带表头.前缀(命名空间)SOAP格式.这次需求是解析一个xml的模板(xls内容),然后填充数据,最后保存.需要时可转换xls.pdf等文件.关于这种带 ...

  9. .NET环境下,通过LINQ操作SQLite数据库

    //对应数据库中的某个表 [Table(Name = "main.Student")]    public class Student    {        [Column(Na ...

随机推荐

  1. Linux系统Docker配置阿里云镜像加速器

    vim /etc/docker/daemon.json # 替换为 "registry-mirrors": ["https://v2ltjwbg.mirror.aliyu ...

  2. 1.springboot内置tomcat的connection相关

    最近在研究tomcat的连接超时问题,环境:jdk1.8 + springboot 2.1.1.RELEASE,以下仅为个人理解,如果异议,欢迎指正. springboot的tomcat的几个配置参数 ...

  3. redis4. dict字典

    基础数据结构: (注意dict是字典,dict->type是相关函数指针, dict->type->keyDup是执行该方法) 具体调用链路: 渐进式rehash: 新增/删除时: ...

  4. jq批量与表单赋值

    function loadData(obj) { var key, value, tagName, type, arr; for (x in obj) { key = x; value = obj[x ...

  5. vscode如何右键选择浏览器运行html文件

    我们利用Vscode软件编写html的时候,一般都想右键选择html文件,然后直接选择浏览器运行,但是默认是没有的: 下面鄙人给大家分享一下如何设置. 这里你会发现有好多类似的插件,你自己选择一个喜欢 ...

  6. TCP怎么保证证包有序传输的,TCP的慢启动,拥塞避免,快速重传,快速恢复

    TCP提供了最可靠的数据传输,它给发送的每个数据包做顺序化(这看起来非常烦琐),然而,如果TCP没有这样烦琐的操作,那么,可能会造成更多的麻烦.如造成数据包的重传.顺序的颠倒甚至造成数据包的丢失. 那 ...

  7. 【转载】oracle中decode函数用法

    1.DECODE的语法:DECODE(value,if1,then1,if2,then2,if3,then3,...,else).表示假设value 等于if1时,DECODE函数的结果返回then1 ...

  8. three.js 之 透明物体不能正常显示

    这几天遇到一个需求,类似这个案例:http://www.hightopo.com/demo/FaultDetection/ 就是这个透明渐变呼吸光柱,看到之后就想着写个shader材质实现透明度渐变, ...

  9. MBProgressHUD长时间加载无法取消的解决方法

    使用MBProgressHUD时,加载网路数据,或者等待webview加载完毕,长时间的等待导致体验不佳,这时候希望点击屏幕取消加载动画效果: // MBProgressHUD.h @protocol ...

  10. 了解DrawCall

    一.什么是DrawCall DrawCall的含义就是CPU调用图像编程接口,以命令GPU进行渲染的操作. CPU和GPU通过使用一个命令缓冲区实现并行工作.命令缓冲区包含一个命令队列,CPU向其中添 ...