Created
May 24, 2015 19:27
-
-
Save kitlabcode/6b57859a674237c3c08a to your computer and use it in GitHub Desktop.
LINQ Join Extensions
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| using System; | |
| using System.Collections.Generic; | |
| using System.Linq; | |
| namespace JoinExtensionExamples | |
| { | |
| public static class JoinExtension | |
| { | |
| public static IEnumerable<TResult> LeftJoin<TSource, TInner, TKey, TResult>(this IEnumerable<TSource> source, | |
| IEnumerable<TInner> inner, | |
| Func<TSource, TKey> primaryKey, | |
| Func<TInner, TKey> foreignKey, | |
| Func<TSource, TInner, TResult> resultCollection) | |
| { | |
| var result = from s in source | |
| join i in inner | |
| on primaryKey(s) equals foreignKey(i) into joinData | |
| from left in joinData.DefaultIfEmpty() | |
| select resultCollection(s, left); | |
| return result; | |
| } | |
| public static IEnumerable<TResult> RightJoin<TSource, TInner, TKey, TResult>(this IEnumerable<TSource> source, | |
| IEnumerable<TInner> inner, | |
| Func<TSource, TKey> primaryKey, | |
| Func<TInner, TKey> foreignKey, | |
| Func<TSource, TInner, TResult> resultCollection) | |
| { | |
| var result = from i in inner | |
| join s in source | |
| on foreignKey(i) equals primaryKey(s) into joinData | |
| from right in joinData.DefaultIfEmpty() | |
| select resultCollection(right, i); | |
| return result; | |
| } | |
| public static IEnumerable<TResult> FullOuterJoin<TSource, TInner, TKey, TResult>(this IEnumerable<TSource> source, | |
| IEnumerable<TInner> inner, | |
| Func<TSource, TKey> primaryKey, | |
| Func<TInner, TKey> foreignKey, | |
| Func<TSource, TInner, TResult> resultCollection) | |
| { | |
| IEnumerable<TSource> sourceCollection = source as IList<TSource> ?? source.ToList(); | |
| IEnumerable<TInner> innerCollection = inner as IList<TInner> ?? inner.ToList(); | |
| var left = sourceCollection.LeftJoin(innerCollection, primaryKey, foreignKey, resultCollection).ToList(); | |
| var right = sourceCollection.RightJoin(innerCollection, primaryKey, foreignKey, resultCollection).ToList(); | |
| return left.Union(right); | |
| } | |
| public static IEnumerable<TResult> LeftExclusiveJoin<TSource, TInner, TKey, TResult>(this IEnumerable<TSource> source, | |
| IEnumerable<TInner> inner, | |
| Func<TSource, TKey> primaryKey, | |
| Func<TInner, TKey> foreignKey, | |
| Func<TSource, TInner, TResult> resultCollection) | |
| { | |
| var result = from s in source | |
| join i in inner | |
| on primaryKey(s) equals foreignKey(i) into joinData | |
| from left in joinData.DefaultIfEmpty() | |
| where left == null | |
| select resultCollection(s, left); | |
| return result; | |
| } | |
| public static IEnumerable<TResult> RightExclusiveJoin<TSource, TInner, TKey, TResult>(this IEnumerable<TSource> source, | |
| IEnumerable<TInner> inner, | |
| Func<TSource, TKey> primaryKey, | |
| Func<TInner, TKey> foreignKey, | |
| Func<TSource, TInner, TResult> resultCollection) | |
| { | |
| var result = from i in inner | |
| join s in source | |
| on foreignKey(i) equals primaryKey(s) into joinData | |
| from right in joinData.DefaultIfEmpty() | |
| where right == null | |
| select resultCollection(right, i); | |
| return result; | |
| } | |
| public static IEnumerable<TResult> FullOuterExclusiveJoin<TSource, TInner, TKey, TResult>(this IEnumerable<TSource> source, | |
| IEnumerable<TInner> inner, | |
| Func<TSource, TKey> primaryKey, | |
| Func<TInner, TKey> foreignKey, | |
| Func<TSource, TInner, TResult> resultCollection) | |
| { | |
| IEnumerable<TSource> sourceCollection = source as IList<TSource> ?? source.ToList(); | |
| IEnumerable<TInner> innerCollection = inner as IList<TInner> ?? inner.ToList(); | |
| var left = sourceCollection.LeftExclusiveJoin(innerCollection, primaryKey, foreignKey, resultCollection).ToList(); | |
| var right = sourceCollection.RightExclusiveJoin(innerCollection, primaryKey, foreignKey, resultCollection).ToList(); | |
| return left.Union(right); | |
| } | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment