Linq 集合操作

演示代码

两个对象一个是Person,一个Address, AddressId是外键,

public class Person

{

public string ID { get; set; }

public string Name { get; set; }

public int Age { get; set; }

public double Salary { get; set; }

public DateTime Born { get; set; }

public int IdAddress { get; set; }

}

public class Address

{

public int IdAddress { get; set; }

public string Street { get; set; }

public int Num { get; set; }

public string City { get; set; }

}

  

测试数据如下

Person类

Address类

下面我会用7个方式实现7中集合操作

  1. INNER JOIN 内链接
  2. LEFT JOIN 左连接
  3. RIGHT JOIN 右链接
  4. FULL OUTER JOIN 所有
  5. LEFT JOIN EXCLUDING INNER JOIN 左空
  6. RIGHT JOIN EXCLUDING INNER JOIN 右空
  7. FULL OUTER JOIN EXCLUDING INNER JOIN ??

    学校数学没学好不知道专业术语!哈哈

    INNER JOIN

    最常用的方法,两表关联查询

    标准Linq语法

    var result = from p in Person.BuiltPersons()
    
    join a in Address.BuiltAddresses()
    
    on p.IdAddress equals a.IdAddress
    
    select new
    
         {
    
    Name = a.MyPerson.Name,
    
    Age = a.MyPerson.Age,
    
    PersonIdAddress = a.MyPerson.IdAddress,
    
    AddressIdAddress = a.MyAddress.IdAddress,
    
    Street = a.MyAddress.Street
    
         };
    

      

    Lambda Expression:

    var resultJoint = Person.BuiltPersons().Join( /// Source Collection
    
    Address.BuiltAddresses(), /// Inner Collection
    
    p => p.IdAddress, /// PK
    
    a => a.IdAddress, /// FK
    
    (p, a) => new { MyPerson = p, MyAddress = a }) /// Result Collection
    
    .Select(a => new
    
    {
    
    Name = a.MyPerson.Name,
    
    Age = a.MyPerson.Age,
    
    PersonIdAddress = a.MyPerson.IdAddress,
    
    AddressIdAddress = a.MyAddress.IdAddress,
    
    Street = a.MyAddress.Street
    
    });
    

      

    Lambda表达式主要有5部分

  8. Is the main Collection. 
  9. Is the inner Collection.
  10. Is the PK.
  11. Is the FK.
  12. Is the type for the result collection. 

    查询结果如下

    LEFT JOIN

    新增一个LeftJoin的扩展方法

    public static IEnumerable<TResult>
    
        LeftJoin<TSource, TInner, TKey, TResult>(this IEnumerable<TSource> source,
    
    IEnumerable<TInner> inner,
    
    Func<TSource, TKey> pk,
    
    Func<TInner, TKey> fk,
    
    Func<TSource, TInner, TResult> result)
    
    {
    
    IEnumerable<TResult> _result = Enumerable.Empty<TResult>();
    
    _result = from s in source
    
    join i in inner
    
    on pk(s) equals fk(i) into joinData
    
    from left in joinData.DefaultIfEmpty()
    
    select result(s, left);
    
    return _result;
    
    }
    

      

    Lambda Expression:

    var resultJoint = Person.BuiltPersons().LeftJoin( /// Source Collection
    
    Address.BuiltAddresses(), /// Inner Collection
    
    p => p.IdAddress, /// PK
    
    a => a.IdAddress, /// FK
    
    (p, a) => new { MyPerson = p, MyAddress = a }) /// Result Collection
    
    .Select(a => new
    
    {
    
    Name = a.MyPerson.Name,
    
    Age = a.MyPerson.Age,
    
    PersonIdAddress = a.MyPerson.IdAddress,
    
    AddressIdAddress = (a.MyAddress != null ? a.MyAddress.IdAddress : -1),
    
                Street = (a.MyAddress != null ? a.MyAddress.Street : "Null-Value")
    
    });
    

      

    注意:如果address为空Null需要做一个替换,否则会报错

    查询结果如下

    RIGHT JOIN

    Extension Method:

    public static IEnumerable<TResult>
    
        RightJoin<TSource, TInner, TKey, TResult>(this IEnumerable<TSource> source,
    
    IEnumerable<TInner> inner,
    
    Func<TSource, TKey> pk,
    
    Func<TInner, TKey> fk,
    
    Func<TSource, TInner, TResult> result)
    
    {
    
    IEnumerable<TResult> _result = Enumerable.Empty<TResult>();
    
    _result = from i in inner
    
    join s in source
    
    on fk(i) equals pk(s) into joinData
    
    from right in joinData.DefaultIfEmpty()
    
    select result(right, i);
    
    return _result;
    
    }
    

      

    Lambda Expression:

    var resultJoint = Person.BuiltPersons().RightJoin( /// Source Collection
    
    Address.BuiltAddresses(), /// Inner Collection
    
    p => p.IdAddress, /// PK
    
    a => a.IdAddress, /// FK
    
    (p, a) => new { MyPerson = p, MyAddress = a }) /// Result Collection
    
    .Select(a => new
    
    {
    
    Name = (a.MyPerson != null ? a.MyPerson.Name : "Null-Value"),
    
    Age = (a.MyPerson != null ? a.MyPerson.Age : -1),
    
    PersonIdAddress = (a.MyPerson != null ? a.MyPerson.IdAddress : -1),
    
    AddressIdAddress = a.MyAddress.IdAddress,
    
    Street = a.MyAddress.Street
    
    });
    

      

    查询结果如下

    FULL OUTER JOIN

    Extension Method:

    public static IEnumerable<TResult>
    
        FullOuterJoinJoin<TSource, TInner, TKey, TResult>(this IEnumerable<TSource> source,
    
    IEnumerable<TInner> inner,
    
    Func<TSource, TKey> pk,
    
    Func<TInner, TKey> fk,
    
    Func<TSource, TInner, TResult> result)
    
    {
    
    var left = source.LeftJoin(inner, pk, fk, result).ToList();
    
    var right = source.RightJoin(inner, pk, fk, result).ToList();
    
    return left.Union(right);
    
    }
    

      

    Lambda Expression:

    var resultJoint = Person.BuiltPersons().FullOuterJoinJoin( /// Source Collection
    
    Address.BuiltAddresses(), /// Inner Collection
    
    p => p.IdAddress, /// PK
    
    a => a.IdAddress, /// FK
    
    (p, a) => new { MyPerson = p, MyAddress = a }) /// Result Collection
    
    .Select(a => new
    
    {
    
    Name = (a.MyPerson != null ? a.MyPerson.Name : "Null-Value"),
    
    Age = (a.MyPerson != null ? a.MyPerson.Age : -1),
    
    PersonIdAddress = (a.MyPerson != null ? a.MyPerson.IdAddress : -1),
    
    AddressIdAddress = (a.MyAddress != null ? a.MyAddress.IdAddress : -1),
    
    Street = (a.MyAddress != null ? a.MyAddress.Street : "Null-Value")
    
    });
    

      

    注意:每个对象都需要验证Null

    查询结果如下

    LEFT EXCLUDING JOIN

    Extension Method:

    public static IEnumerable<TResult>
    
        LeftExcludingJoin<TSource, TInner, TKey, TResult>(this IEnumerable<TSource> source,
    
    IEnumerable<TInner> inner,
    
    Func<TSource, TKey> pk,
    
    Func<TInner, TKey> fk,
    
    Func<TSource, TInner, TResult> result)
    
    {
    
    IEnumerable<TResult> _result = Enumerable.Empty<TResult>();
    
    _result = from s in source
    
    join i in inner
    
    on pk(s) equals fk(i) into joinData
    
    from left in joinData.DefaultIfEmpty()
    
    where left == null
    
    select result(s, left);
    
    return _result;
    
    }
    

      

    Lambda Expression:

    var resultJoint = Person.BuiltPersons().LeftExcludingJoin( /// Source Collection
    
    Address.BuiltAddresses(), /// Inner Collection
    
    p => p.IdAddress, /// PK
    
    a => a.IdAddress, /// FK
    
    (p, a) => new { MyPerson = p, MyAddress = a }) /// Result Collection
    
    .Select(a => new
    
    {
    
    Name = a.MyPerson.Name,
    
    Age = a.MyPerson.Age,
    
    PersonIdAddress = a.MyPerson.IdAddress,
    
    AddressIdAddress = (a.MyAddress != null ? a.MyAddress.IdAddress : -1),
    
    Street = (a.MyAddress != null ? a.MyAddress.Street : "Null-Value")
    
    });
    

      

    查询结果如下

    RIGHT EXCLUDING JOIN

    Extension Method:

    public static IEnumerable<TResult>
    
    RightExcludingJoin<TSource, TInner, TKey, TResult>(this IEnumerable<TSource> source,
    
    IEnumerable<TInner> inner,
    
    Func<TSource, TKey> pk,
    
    Func<TInner, TKey> fk,
    
    Func<TSource, TInner, TResult> result)
    
    {
    
    IEnumerable<TResult> _result = Enumerable.Empty<TResult>();
    
    _result = from i in inner
    
    join s in source
    
    on fk(i) equals pk(s) into joinData
    
    from right in joinData.DefaultIfEmpty()
    
    where right == null
    
    select result(right, i);
    
    return _result;
    
    }
    

      

    Lambda Expression:

    var resultJoint = Person.BuiltPersons().RightExcludingJoin( /// Source Collection
    
    Address.BuiltAddresses(), /// Inner Collection
    
    p => p.IdAddress, /// PK
    
    a => a.IdAddress, /// FK
    
    (p, a) => new { MyPerson = p, MyAddress = a }) /// Result Collection
    
    .Select(a => new
    
    {
    
    Name = (a.MyPerson != null ? a.MyPerson.Name : "Null-Value"),
    
    Age = (a.MyPerson != null ? a.MyPerson.Age : -1),
    
    PersonIdAddress = (a.MyPerson != null ? a.MyPerson.IdAddress : -1),
    
    AddressIdAddress = a.MyAddress.IdAddress,
    
    Street = a.MyAddress.Street
    
    });
    

      

    查询结果

    FULL OUTER EXCLUDING JOIN

    Extension Method:

    public static IEnumerable<TResult>
    
    FulltExcludingJoin<TSource, TInner, TKey, TResult>(this IEnumerable<TSource> source,
    
    IEnumerable<TInner> inner,
    
    Func<TSource, TKey> pk,
    
    Func<TInner, TKey> fk,
    
    Func<TSource, TInner, TResult> result)
    
    {
    
    var left = source.LeftExcludingJoin(inner, pk, fk, result).ToList();
    
    var right = source.RightExcludingJoin(inner, pk, fk, result).ToList();
    
    return left.Union(right);
    
    }
    

      

    Lambda Expression:

    var resultJoint = Person.BuiltPersons().FulltExcludingJoin( /// Source Collection
    
    Address.BuiltAddresses(), /// Inner Collection
    
    p => p.IdAddress, /// PK
    
    a => a.IdAddress, /// FK
    
    (p, a) => new { MyPerson = p, MyAddress = a }) /// Result Collection
    
    .Select(a => new
    
    {
    
    Name = (a.MyPerson != null ? a.MyPerson.Name : "Null-Value"),
    
    Age = (a.MyPerson != null ? a.MyPerson.Age : -1),
    
    PersonIdAddress = (a.MyPerson != null ? a.MyPerson.IdAddress : -1),
    
    AddressIdAddress = (a.MyAddress != null ? a.MyAddress.IdAddress : -1),
    
    Street = (a.MyAddress != null ? a.MyAddress.Street : "Null-Value")
    
    });
    

      

    查询结果

Linq 集合操作的更多相关文章

  1. Linq集合操作之Intersect,Except,Union源码分析

    Linq集合操作之Intersect,Except,Union源码分析 linq的集合运算 常见的集合运算有哪些? 这三个扩展方法在我们实际使用中用的还是非常多的,而且这里还涉及到了“复杂度” 无算法 ...

  2. C#LINQ集合操作

    LINQ的集合运算 List<int> lstOne = new List<int>() { 1, 55, 223, 25 }; List<int> lstTwo ...

  3. Linq聚合操作之Aggregate,Count,Sum,Distinct源码分析

    Linq聚合操作之Aggregate,Count,Sum,Distinct源码分析 一:Linq的聚合运算 1. 常见的聚合运算:Aggregate,Count, Sum, Distinct,Max, ...

  4. Linq生成操作之DefautIfEmpty,Empty,Range,Repeat源码分析

    Linq生成操作之DefautIfEmpty,Empty,Range,Repeat源码分析 Linq的四种生成运算 DefautIfEmpty,Empty,Range,Repeat 也就是给我们初始化 ...

  5. Linq转换操作之OfType,Cast,AsEnumerable,ToLookup源码分析

    Linq转换操作之OfType,Cast,AsEnumerable,ToLookup源码分析 一:Tolookup 1. 从方法的注解上可以看到,ToLookup也是一个k,v的形式,那么问题来了,它 ...

  6. Linq转换操作之ToArray,ToList,ToDictionary源码分析

    Linq转换操作之ToArray,ToList,ToDictionary源码分析 一:linq中的转换运算符 1. ToArray 我们经常用在linq查询上吧. linq只能运用在IEnumerab ...

  7. 函数式Android编程(II):Kotlin语言的集合操作

    原文标题:Functional Android (II): Collection operations in Kotlin 原文链接:http://antonioleiva.com/collectio ...

  8. JAVASE02-Unit05: 集合操作 —— 查找表

    Unit05: 集合操作 -- 查找表 使用该类测试自定义元素的集合排序 package day05; /** * 使用该类测试自定义元素的集合排序 * @author adminitartor * ...

  9. JAVASE02-Unit04: 集合框架 、 集合操作 —— 线性表

    Unit04: 集合框架 . 集合操作 -- 线性表 操作集合元素相关方法 package day04; import java.util.ArrayList; import java.util.Co ...

随机推荐

  1. AWK----awk与shell交互

    1互相调用命令  ls | awk '{if(system("ls " $0)==0) print "file "$0" exsits"}' ...

  2. MySql Host is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts' 解决方法 -摘自网络

    错误:Host is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts' 原因: 同一个i ...

  3. 《算法导论》习题2.3-5 二分搜索 Binary Search

    地球人都知道“二分查找”,方法也非常简单,但是你能不能在10分钟内写出一个没有bug的程序呢? 知易行难,自己动手写一下试一试吧. public class BinarySearch { public ...

  4. STM8的中断系统以及外部中断详解

    STM8具有最多32的中断系统,在中断的处理上类似于cortexm系列的芯片,首先是每个中断的向量都是固化在系统内部的,用户需要向相应的中断向量flash位置写入中断处理函数,其二,每个中断向量都具有 ...

  5. S3C2440硬件IIC详解

    S3C2440A RISC微处理器可以支持一个多主控IIC 总线串行接口.一条专用串行数据线(SDA)和一条专用串行时钟线(SCL)传递连接到IIC总线的总线主控和外设之间的信息.SDA和SCL线都为 ...

  6. iOS学习笔记(十三)——获取手机信息(UIDevice、NSBundle、NSLocale)

    iOS的APP的应用开发的过程中,有时为了bug跟踪或者获取用反馈的需要自动收集用户设备.系统信息.应用信息等等,这些信息方便开发者诊断问题,当然这些信息是用户的非隐私信息,是通过开发api可以获取到 ...

  7. 刷新UITableView

    [from]http://www.superqq.com/blog/2015/08/18/ios-development-refresh-uitableview/ UITableView对于iOS开发 ...

  8. python 爬照片 模拟浏览器 先登录账号

    # -*- coding: utf-8 -*-"""Created on Mon Mar 7 10:53:40 2016 @author: root"" ...

  9. Angular - - ngInclude、ngTransclude

    这两个都是HTML DOM嵌入指令 ngInclude 读取,编译和插入外部的HTML片段. 格式:ng-include=“value”<ng-include src=”value” onloa ...

  10. eclipse调试找不到源解决办法

    eclipse调试时有时显示找不到源码,首先得确定代码没问题 这是eclipse没有发现工程源码,解决办法是 右键工程>>Debug As >> Debug configura ...