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));
}
}
}}