Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
Foxtrek_64 authored and eiriktsarpalis committed Mar 17, 2021
1 parent cb2db6f commit b261537
Show file tree
Hide file tree
Showing 5 changed files with 165 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,20 @@ public static MethodInfo FirstOrDefault_TSource_2(Type TSource) =>
(s_FirstOrDefault_TSource_2 ??= new Func<IQueryable<object>, Expression<Func<object, bool>>, object?>(Queryable.FirstOrDefault).GetMethodInfo().GetGenericMethodDefinition())
.MakeGenericMethod(TSource);

private static MethodInfo? s_FirstOrDefault_TSource_3;

public static MethodInfo FirstOrDefault_TSource_3(Type TSource) =>
(s_FirstOrDefault_TSource_3 ??
(s_FirstOrDefault_TSource_3 = new Func<IQueryable<object>, object?, object?>(Queryable.FirstOrDefault).GetMethodInfo().GetGenericMethodDefinition()))
.MakeGenericMethod();

private static MethodInfo? s_FirstOrDefault_TSource_4;

public static MethodInfo FirstOrDefault_TSource_4(Type TSource) =>
(s_FirstOrDefault_TSource_4 ??
(s_FirstOrDefault_TSource_4 = new Func<IQueryable<object>, Expression<Func<object, bool>>, object?, object?>(Queryable.FirstOrDefault).GetMethodInfo().GetGenericMethodDefinition()))
.MakeGenericMethod(TSource);

private static MethodInfo? s_GroupBy_TSource_TKey_2;

public static MethodInfo GroupBy_TSource_TKey_2(Type TSource, Type TKey) =>
Expand Down Expand Up @@ -392,6 +406,20 @@ public static MethodInfo LastOrDefault_TSource_2(Type TSource) =>
(s_LastOrDefault_TSource_2 ??= new Func<IQueryable<object>, Expression<Func<object, bool>>, object?>(Queryable.LastOrDefault).GetMethodInfo().GetGenericMethodDefinition())
.MakeGenericMethod(TSource);

private static MethodInfo? s_LastOrDefault_TSource_3;

public static MethodInfo LastOrDefault_TSource_3(Type TSource) =>
(s_LastOrDefault_TSource_3 ??
(s_LastOrDefault_TSource_3 = new Func<IQueryable<object>, object?, object?>(Queryable.LastOrDefault).GetMethodInfo().GetGenericMethodDefinition()))
.MakeGenericMethod(TSource);

private static MethodInfo? s_LastOrDefault_TSource_4;

public static MethodInfo LastOrDefault_TSource_4(Type TSource) =>
(s_LastOrDefault_TSource_4 ??
(s_LastOrDefault_TSource_4 = new Func<IQueryable<object>, Expression<Func<object, bool>>, object?, object?>(Queryable.LastOrDefault).GetMethodInfo().GetGenericMethodDefinition()))
.MakeGenericMethod(TSource);

private static MethodInfo? s_LongCount_TSource_1;

public static MethodInfo LongCount_TSource_1(Type TSource) =>
Expand Down Expand Up @@ -536,6 +564,20 @@ public static MethodInfo SingleOrDefault_TSource_2(Type TSource) =>
(s_SingleOrDefault_TSource_2 ??= new Func<IQueryable<object>, Expression<Func<object, bool>>, object?>(Queryable.SingleOrDefault).GetMethodInfo().GetGenericMethodDefinition())
.MakeGenericMethod(TSource);

private static MethodInfo? s_SingleOrDefault_TSource_3;

public static MethodInfo SingleOrDefault_TSource_3(Type TSource) =>
(s_SingleOrDefault_TSource_3 ??
(s_SingleOrDefault_TSource_3 = new Func<IQueryable<object>, object?, object?>(Queryable.SingleOrDefault).GetMethodInfo().GetGenericMethodDefinition()))
.MakeGenericMethod(TSource);

private static MethodInfo? s_SingleOrDefault_TSource_4;

public static MethodInfo SingleOrDefault_TSource_4(Type TSource) =>
(s_SingleOrDefault_TSource_4 ??
(s_SingleOrDefault_TSource_4 = new Func<IQueryable<object>, Expression<Func<object, bool>>, object?, object?>(Queryable.SingleOrDefault).GetMethodInfo().GetGenericMethodDefinition()))
.MakeGenericMethod();

private static MethodInfo? s_Skip_TSource_2;

public static MethodInfo Skip_TSource_2(Type TSource) =>
Expand Down
82 changes: 82 additions & 0 deletions src/libraries/System.Linq.Queryable/src/System/Linq/Queryable.cs
Original file line number Diff line number Diff line change
Expand Up @@ -864,6 +864,18 @@ public static TSource First<TSource>(this IQueryable<TSource> source, Expression
CachedReflectionInfo.FirstOrDefault_TSource_1(typeof(TSource)), source.Expression));
}

[DynamicDependency("FirstOrDefault`1", typeof(Enumerable))]
public static TSource? FirstOrDefault<TSource>(this IQueryable<TSource> source, TSource? defaultValue)
{
if (source == null)
throw Error.ArgumentNull(nameof(source));
return source.Provider.Execute<TSource>(
Expression.Call(
null,
CachedReflectionInfo.FirstOrDefault_TSource_3(typeof(TSource)),
source.Expression, Expression.Constant(defaultValue, typeof(TSource))));
}

[DynamicDependency("FirstOrDefault`1", typeof(Enumerable))]
public static TSource? FirstOrDefault<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate)
{
Expand All @@ -879,6 +891,21 @@ public static TSource First<TSource>(this IQueryable<TSource> source, Expression
));
}

[DynamicDependency("FirstOrDefault`1", typeof(Enumerable))]
public static TSource? FirstOrDefault<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate, TSource? defaultValue)
{
if (source == null)
throw Error.ArgumentNull(nameof(source));
if (predicate == null)
throw Error.ArgumentNull(nameof(predicate));
return source.Provider.Execute<TSource>(
Expression.Call(
null,
CachedReflectionInfo.FirstOrDefault_TSource_4(typeof(TSource)),
source.Expression, Expression.Quote(predicate), Expression.Constant(defaultValue, typeof(TSource))
));
}

[DynamicDependency("Last`1", typeof(Enumerable))]
public static TSource Last<TSource>(this IQueryable<TSource> source)
{
Expand Down Expand Up @@ -916,6 +943,18 @@ public static TSource Last<TSource>(this IQueryable<TSource> source, Expression<
CachedReflectionInfo.LastOrDefault_TSource_1(typeof(TSource)), source.Expression));
}

[DynamicDependency("LastOrDefault`1", typeof(Enumerable))]
public static TSource? LastOrDefault<TSource>(this IQueryable<TSource> source, TSource? defaultValue)
{
if (source == null)
throw Error.ArgumentNull(nameof(source));
return source.Provider.Execute<TSource>(
Expression.Call(
null,
CachedReflectionInfo.LastOrDefault_TSource_3(typeof(TSource)),
source.Expression, Expression.Constant(defaultValue, typeof(TSource))));
}

[DynamicDependency("LastOrDefault`1", typeof(Enumerable))]
public static TSource? LastOrDefault<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate)
{
Expand All @@ -931,6 +970,21 @@ public static TSource Last<TSource>(this IQueryable<TSource> source, Expression<
));
}

[DynamicDependency("LastOrDefault`1", typeof(Enumerable))]
public static TSource? LastOrDefault<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate, TSource? defaultValue)
{
if (source == null)
throw Error.ArgumentNull(nameof(source));
if (predicate == null)
throw Error.ArgumentNull(nameof(predicate));
return source.Provider.Execute<TSource>(
Expression.Call(
null,
CachedReflectionInfo.LastOrDefault_TSource_4(typeof(TSource)),
source.Expression, Expression.Quote(predicate), Expression.Constant(defaultValue, typeof(TSource))
));
}

[DynamicDependency("Single`1", typeof(Enumerable))]
public static TSource Single<TSource>(this IQueryable<TSource> source)
{
Expand Down Expand Up @@ -968,6 +1022,19 @@ public static TSource Single<TSource>(this IQueryable<TSource> source, Expressio
CachedReflectionInfo.SingleOrDefault_TSource_1(typeof(TSource)), source.Expression));
}

[DynamicDependency("SingleOrDefault`1", typeof(Enumerable))]
public static TSource? SingleOrDefault<TSource>(this IQueryable<TSource> source, TSource? defaultValue)
{
if (source == null)
throw Error.ArgumentNull(nameof(source));
return source.Provider.Execute<TSource>(
Expression.Call(
null,
CachedReflectionInfo.SingleOrDefault_TSource_3(typeof(TSource)),
source.Expression, Expression.Constant(defaultValue, typeof(TSource))));

}

[DynamicDependency("SingleOrDefault`1", typeof(Enumerable))]
public static TSource? SingleOrDefault<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate)
{
Expand All @@ -983,6 +1050,21 @@ public static TSource Single<TSource>(this IQueryable<TSource> source, Expressio
));
}

[DynamicDependency("SingleOrDefault`1", typeof(Enumerable))]
public static TSource? SingleOrDefault<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate, TSource? defaultValue)
{
if (source == null)
throw Error.ArgumentNull(nameof(source));
if (predicate == null)
throw Error.ArgumentNull(nameof(predicate));
return source.Provider.Execute<TSource>(
Expression.Call(
null,
CachedReflectionInfo.SingleOrDefault_TSource_4(typeof(TSource)),
source.Expression, Expression.Quote(predicate), Expression.Constant(defaultValue, typeof(TSource))
));
}

[DynamicDependency("ElementAt`1", typeof(Enumerable))]
public static TSource ElementAt<TSource>(this IQueryable<TSource> source, int index)
{
Expand Down
24 changes: 18 additions & 6 deletions src/libraries/System.Linq/src/System/Linq/First.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,21 @@ public static TSource First<TSource>(this IEnumerable<TSource> source, Func<TSou
}

public static TSource? FirstOrDefault<TSource>(this IEnumerable<TSource> source) =>
source.TryGetFirst(out bool _);
source.TryGetFirst(out _);

public static TSource? FirstOrDefault<TSource>(this IEnumerable<TSource> source, TSource? defaultValue) =>
source.TryGetFirst(defaultValue, out _);

public static TSource? FirstOrDefault<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) =>
source.TryGetFirst(predicate, out bool _);
source.TryGetFirst(predicate, out _);

public static TSource? FirstOrDefault<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, TSource? defaultValue) =>
source.TryGetFirst(predicate, defaultValue, out _);

private static TSource? TryGetFirst<TSource>(this IEnumerable<TSource> source, out bool found)
private static TSource? TryGetFirst<TSource>(this IEnumerable<TSource> source, out bool found) =>
source.TryGetFirst(default(TSource), out found);

private static TSource? TryGetFirst<TSource>(this IEnumerable<TSource> source, TSource? defaultValue, out bool found)
{
if (source == null)
{
Expand Down Expand Up @@ -69,10 +78,13 @@ public static TSource First<TSource>(this IEnumerable<TSource> source, Func<TSou
}

found = false;
return default;
return defaultValue;
}

private static TSource? TryGetFirst<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, out bool found)
private static TSource? TryGetFirst<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, out bool found) =>
source.TryGetFirst(predicate, default(TSource), out found);

private static TSource? TryGetFirst<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, TSource? defaultValue, out bool found)
{
if (source == null)
{
Expand All @@ -94,7 +106,7 @@ public static TSource First<TSource>(this IEnumerable<TSource> source, Func<TSou
}

found = false;
return default;
return defaultValue;
}
}
}
20 changes: 14 additions & 6 deletions src/libraries/System.Linq/src/System/Linq/Last.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,19 @@ public static TSource Last<TSource>(this IEnumerable<TSource> source, Func<TSour
return last!;
}

public static TSource? LastOrDefault<TSource>(this IEnumerable<TSource> source) =>
source.TryGetLast(out bool _);
public static TSource? LastOrDefault<TSource>(this IEnumerable<TSource> source)
=> source.TryGetLast(out _);
public static TSource? LastOrDefault<TSource>(this IEnumerable<TSource> source, TSource? defaultValue)
=> source.TryGetLast(defaultValue, out _);

public static TSource? LastOrDefault<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) =>
source.TryGetLast(predicate, out bool _);
public static TSource? LastOrDefault<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
=> source.TryGetLast(predicate, out bool _);
public static TSource? LastOrDefault<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, TSource? defaultValue)
=> source.TryGetLast(predicate, defaultValue, out bool _);

private static TSource? TryGetLast<TSource>(this IEnumerable<TSource> source, out bool found)
=> source.TryGetLast(default(TSource?), out found);
private static TSource? TryGetLast<TSource>(this IEnumerable<TSource> source, TSource? defaultValue, out bool found)
{
if (source == null)
{
Expand Down Expand Up @@ -77,10 +83,12 @@ public static TSource Last<TSource>(this IEnumerable<TSource> source, Func<TSour
}

found = false;
return default;
return defaultValue;
}

private static TSource? TryGetLast<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, out bool found)
=> source.TryGetLast(predicate, default(TSource?), out found);
private static TSource? TryGetLast<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, TSource? defaultValue, out bool found)
{
if (source == null)
{
Expand Down Expand Up @@ -135,7 +143,7 @@ public static TSource Last<TSource>(this IEnumerable<TSource> source, Func<TSour
}

found = false;
return default;
return defaultValue;
}
}
}
12 changes: 9 additions & 3 deletions src/libraries/System.Linq/src/System/Linq/Single.cs
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,9 @@ public static TSource Single<TSource>(this IEnumerable<TSource> source, Func<TSo
}

public static TSource? SingleOrDefault<TSource>(this IEnumerable<TSource> source)
=> source.SingleOrDefault(default(TSource));

public static TSource? SingleOrDefault<TSource>(this IEnumerable<TSource> source, TSource? defaultValue)
{
if (source == null)
{
Expand All @@ -95,7 +98,7 @@ public static TSource Single<TSource>(this IEnumerable<TSource> source, Func<TSo
switch (list.Count)
{
case 0:
return default;
return defaultValue;
case 1:
return list[0];
}
Expand All @@ -106,7 +109,7 @@ public static TSource Single<TSource>(this IEnumerable<TSource> source, Func<TSo
{
if (!e.MoveNext())
{
return default;
return defaultValue;
}

TSource result = e.Current;
Expand All @@ -122,6 +125,9 @@ public static TSource Single<TSource>(this IEnumerable<TSource> source, Func<TSo
}

public static TSource? SingleOrDefault<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
=> source.SingleOrDefault(predicate, default);

public static TSource? SingleOrDefault<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, TSource? defaultValue)
{
if (source == null)
{
Expand Down Expand Up @@ -153,7 +159,7 @@ public static TSource Single<TSource>(this IEnumerable<TSource> source, Func<TSo
}
}

return default;
return defaultValue;
}
}
}

0 comments on commit b261537

Please sign in to comment.