Skip to content

Instantly share code, notes, and snippets.

@kitlabcode
Created May 24, 2015 19:27
Show Gist options
  • Select an option

  • Save kitlabcode/6b57859a674237c3c08a to your computer and use it in GitHub Desktop.

Select an option

Save kitlabcode/6b57859a674237c3c08a to your computer and use it in GitHub Desktop.
LINQ Join Extensions
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