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. [Android]SDK安装

    安装Android环境时,出现的问题 //在国内安装Android环境时,经常会因为Google服务器的原因,出现链接失败的问题. Failed to fetch URL http://dl-ssl. ...

  2. Mapreduce TopK

      思想比较简单,就是每个通过map来获取当前的数据块中的的topk个数据,然后将他们以相同的key值放到reduce中,最后通过reduce来对这n*k个数据排序并获得topk个数据.具体的就是建立 ...

  3. 用OpenSSL生成自签名证书在IIS上搭建Https站点(用于iOS的https访问)

    前提: 先安装openssl,安装有两种方式,第一种直接下载安装包,装上就可运行:第二种可以自己下载源码,自己编译.这里推荐第一种. 安装包:http://slproweb.com/products/ ...

  4. iOS开发——沙箱

    iphone沙箱模型的有三个文件夹,documents,tmp,Library.有时开发时要求我们保存一些数据在本地,这就用到了. 1.Documents 目录:您应该将所有de应用程序数据文件写入到 ...

  5. select取值问题

    全栈攻城狮们给挖了各种坑..其中一个典型是select控件取值.直接上代码: <!DOCTYPE html> <html lang="en"> <he ...

  6. 浅谈一个网页打开的全过程(涉及DNS、CDN、Nginx负载均衡等)

    1.概要 从用户在浏览器输入域名开始,到web页面加载完毕,这是一个说复杂不复杂,说简单不简单的过程,下文暂且把这个过程称作网页加载过程.下面我将依靠自己的经验,总结一下整个过程.如有错漏,欢迎指正. ...

  7. SSH报错分析

    排错设计思路 1.配置文件的端口号修改 2.禁用root 3./etc/hosts.allow /etc/hosts.deny 4.iptables 5.密钥文件及目录的权限修改 1. 报错的原因:是 ...

  8. 如何解决Visual Studio2012 与此版本的Windows不兼容

    解决方案: http://www.microsoft.com/zh-CN/download/details.aspx?id=36020   下载更新

  9. 关于浏览器和HTTP协议

    关于浏览器 浏览器的主要功能就是向服务器发出请求,在浏览器窗口中展示想要访问的网络资源.这里资源一般是指 HTML 文档,图片等其他的类型.资源的位置由用户使用 URL(统一资源标示符)指定. 而浏览 ...

  10. .NET防止重复提交数据

    最近在做一个销售系统的时候,操作人员提交数据的时候数据库竟然会出现多条数据相同的记录,并且是在1秒之内,客户反馈给我们,第一反应是重复提交的问题,检查了下代码,程序执行完成后应该是跳转到别的页面的,可 ...