• [转][C#]Linq 的扩展方法


    public static class LinqEx
    {
    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)
        where TSource : class
        where TInner : class
    {
        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;
    }
    
    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)
        where TSource : class
        where TInner : class
    {
        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;
    }
    
    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)
        where TSource : class
        where TInner : class
    {
        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;
    }
    
    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)
        where TSource : class
        where TInner : class
    {
        var left = source.LeftJoin(inner, pk, fk, result).ToList();
        var right = source.RightExcludingJoin(inner, pk, fk, result).ToList();
    
        return left.Union(right);
    }
    }
  • 相关阅读:
    Windows环境中Java多个JDK之间相互切换
    百度地图调用,传递经纬度到后台
    富文本的使用-KindEditor
    Play框架的@OneToMany、@ManyToOne级联操作
    Play框架文件上传
    [20171211][转载]如何实现dbms_output输出没有打开serveroutput on.txt
    [20171211]ora-16014 11g.txt
    [20171206]rman与truncate2.txt
    [20171206]rman与truncate.txt
    [20171205]uniq命令的输入输出.txt
  • 原文地址:https://www.cnblogs.com/z5337/p/10199817.html
Copyright © 2020-2023  润新知