public static IEnumerable <TResult> GroupJoin <TKey, TSource, TInner, TResult>(this IndexDefinition <TSource> source,
                                                                                       IEnumerable <TInner> inner, Func <TInner, TKey> innerKeySelector,
                                                                                       Expression <Func <TSource, TKey> > outerKeySelector,
                                                                                       Func <TSource, IEnumerable <TInner>, TResult> resultSelector,
                                                                                       IEqualityComparer <TKey> equalityComparer)
        {
            Dictionary <TKey, Tuple <TSource, List <TInner> > > dictionary = new Dictionary <TKey, Tuple <TSource, List <TInner> > >();

            foreach (TInner innerItem in inner)
            {
                TKey key   = innerKeySelector(innerItem);
                var  value = IndexFinder.FindInIndex(source, outerKeySelector, key, equalityComparer);
                if (value != null)
                {
                    if (dictionary.ContainsKey(key))
                    {
                        Tuple <TSource, List <TInner> > tuple = dictionary[key];
                        tuple.Item2.Add(innerItem);
                    }
                    else
                    {
                        List <TInner> list = new List <TInner>();
                        list.Add(innerItem);
                        dictionary.Add(key, new Tuple <TSource, List <TInner> >(value, list));
                    }
                }
            }
            foreach (KeyValuePair <TKey, Tuple <TSource, List <TInner> > > key in dictionary)
            {
                yield return(resultSelector(key.Value.Item1, key.Value.Item2));
            }
        }
 public static IEnumerable <TResult> Join <TKey, TSource, TInner, TResult>(this IndexDefinition <TSource> source,
                                                                           IEnumerable <TInner> inner, Func <TInner, TKey> innerKeySelector,
                                                                           Expression <Func <TSource, TKey> > outerKeySelector,
                                                                           Func <TSource, TInner, TResult> resultSelector)
 {
     foreach (TInner innerItem in inner)
     {
         TKey key   = innerKeySelector(innerItem);
         var  value = IndexFinder.FindInIndex(source, outerKeySelector, key, null);
         if (value != null)
         {
             yield return(resultSelector(value, innerItem));
         }
     }
 }