C# Linq实现内连接、左连接

C#中用EF框架做数据查询时,目前只有内连接的相关方法,可以扩展Linq的方法实现相关的左连接(右连接只是参数位置不同即可实现),以下是相关扩展IEnumerable实现Linq的内连接和左连接的方法:

    public static class IEnumerableEntends
    {

        public static IEnumerable<TResult> Joins<TOuter, TInner, TResult>(this IEnumerable<TOuter> outer, IEnumerable<TInner> inner, Func<TOuter, TInner, bool> MatchDelegate, Func<TOuter, TInner, TResult> resultSelector)
        {

            foreach (TOuter to in outer)
            {
                foreach (TInner ti in inner)
                {

                    if (MatchDelegate(to, ti))
                    {
                        yield return resultSelector(to, ti);
                    }

                }
            }

        }

        public static IEnumerable<TResult> LeftJoins<TOuter, TInner, TResult>(this IEnumerable<TOuter> outer, IEnumerable<TInner> inner, Func<TOuter, TInner, bool> MatchDelegate, Func<TOuter, TInner, TResult> resultSelector)
        {

            foreach (TOuter to in outer)
            {
                bool matched = false;
                foreach (TInner ti in inner)
                {

                    if (MatchDelegate(to, ti))
                    {
                        matched = true;
                        yield return resultSelector(to, ti);
                    }

                }

                if (!matched)
                {
                    yield return resultSelector(to, default(TInner));
                }
            }

        }

        public static IEnumerable<TResult> LeftJoin<TOuter, TInner, TKey, TResult>(this IEnumerable<TOuter> outer, IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector, Func<TInner, TKey> innerKeySelector, Func<TOuter, TInner, TResult> resultSelector)
        {
            foreach (TOuter to in outer)
            {
                TKey outkey = outerKeySelector(to);
                bool matched = false;

                foreach (TInner ti in inner)
                {

                    //fix bug: TKey inkey = outerKeySelector(to);
                    TKey inkey = innerKeySelector(ti);

                    if (outkey.Equals(inkey))
                    {
                        matched = true;
                        yield return resultSelector(to, ti);
                    }
                }

                if (!matched)
                {
                    yield return resultSelector(to, default(TInner));
                }
            }
        }

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值