Skip to content

Commit

Permalink
Look up Queryable operator MethodInfos without MakeGenericMethod (#79717
Browse files Browse the repository at this point in the history
)

For NativeAOT compatibility, better speed.

Closes #79199
  • Loading branch information
roji committed Dec 16, 2022
1 parent 64ce464 commit 76e2be8
Show file tree
Hide file tree
Showing 50 changed files with 526 additions and 1,867 deletions.
2 changes: 1 addition & 1 deletion src/libraries/Common/tests/System/Linq/SkipTakeData.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ public static IEnumerable<object[]> QueryableData()
return EnumerableData().Select(array =>
{
var enumerable = (IEnumerable<int>)array[0];
return new object[] { enumerable.AsQueryable(), array[1] };
return new[] { enumerable.AsQueryable(), array[1] };
});
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
<EnableAotAnalyzer>true</EnableAotAnalyzer>
</PropertyGroup>
<ItemGroup>
<Compile Include="System\Linq\CachedReflection.cs" />
<Compile Include="System\Linq\EnumerableExecutor.cs" />
<Compile Include="System\Linq\EnumerableQuery.cs" />
<Compile Include="System\Linq\EnumerableRewriter.cs" />
Expand Down
1,061 changes: 0 additions & 1,061 deletions src/libraries/System.Linq.Queryable/src/System/Linq/CachedReflection.cs

This file was deleted.

804 changes: 305 additions & 499 deletions src/libraries/System.Linq.Queryable/src/System/Linq/Queryable.cs

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions src/libraries/System.Linq.Queryable/tests/AggregateTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,21 +64,21 @@ public void NullResultSelector()
[Fact]
public void Aggregate1()
{
var val = (new int[] { 0, 2, 1 }).AsQueryable().Aggregate((n1, n2) => n1 + n2);
var val = new[] { 0, 2, 1 }.AsQueryable().Aggregate((n1, n2) => n1 + n2);
Assert.Equal((int)3, val);
}

[Fact]
public void Aggregate2()
{
var val = (new int[] { 0, 2, 1 }).AsQueryable().Aggregate("", (n1, n2) => n1 + n2.ToString());
var val = new[] { 0, 2, 1 }.AsQueryable().Aggregate("", (n1, n2) => n1 + n2.ToString());
Assert.Equal("021", val);
}

[Fact]
public void Aggregate3()
{
var val = (new int[] { 0, 2, 1 }).AsQueryable().Aggregate(0L, (n1, n2) => n1 + n2, n => n.ToString());
var val = new[] { 0, 2, 1 }.AsQueryable().Aggregate(0L, (n1, n2) => n1 + n2, n => n.ToString());
Assert.Equal("3", val);
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/libraries/System.Linq.Queryable/tests/AllTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public void NullPredicateUsed()
[Fact]
public void All()
{
var val = (new int[] { 0, 2, 1 }).AsQueryable().All(n => n > 1);
var val = new[] { 0, 2, 1 }.AsQueryable().All(n => n > 1);
Assert.False(val);
}
}
Expand Down
4 changes: 2 additions & 2 deletions src/libraries/System.Linq.Queryable/tests/AnyTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -55,14 +55,14 @@ public void NullPredicateUsed()
[Fact]
public void Any1()
{
var val = (new int[] { 0, 2, 1 }).AsQueryable().Any();
var val = new[] { 0, 2, 1 }.AsQueryable().Any();
Assert.True(val);
}

[Fact]
public void Any2()
{
var val = (new int[] { 0, 2, 1 }).AsQueryable().Any(n => n > 1);
var val = new[] { 0, 2, 1 }.AsQueryable().Any(n => n > 1);
Assert.True(val);
}
}
Expand Down
40 changes: 20 additions & 20 deletions src/libraries/System.Linq.Queryable/tests/AverageTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -432,140 +432,140 @@ public void MultipleFloatFromSelector()
[Fact]
public void Average1()
{
var val = (new int[] { 0, 2, 1 }).AsQueryable().Average();
var val = new[] { 0, 2, 1 }.AsQueryable().Average();
Assert.Equal((double)1, val);
}

[Fact]
public void Average2()
{
var val = (new int?[] { 0, 2, 1 }).AsQueryable().Average();
var val = new int?[] { 0, 2, 1 }.AsQueryable().Average();
Assert.Equal((double)1, val);
}

[Fact]
public void Average3()
{
var val = (new long[] { 0, 2, 1 }).AsQueryable().Average();
var val = new long[] { 0, 2, 1 }.AsQueryable().Average();
Assert.Equal((double)1, val);
}

[Fact]
public void Average4()
{
var val = (new long?[] { 0, 2, 1 }).AsQueryable().Average();
var val = new long?[] { 0, 2, 1 }.AsQueryable().Average();
Assert.Equal((double)1, val);
}

[Fact]
public void Average5()
{
var val = (new float[] { 0, 2, 1 }).AsQueryable().Average();
var val = new float[] { 0, 2, 1 }.AsQueryable().Average();
Assert.Equal((float)1, val);
}

[Fact]
public void Average6()
{
var val = (new float?[] { 0, 2, 1 }).AsQueryable().Average();
var val = new float?[] { 0, 2, 1 }.AsQueryable().Average();
Assert.Equal((float)1, val);
}

[Fact]
public void Average7()
{
var val = (new double[] { 0, 2, 1 }).AsQueryable().Average();
var val = new double[] { 0, 2, 1 }.AsQueryable().Average();
Assert.Equal((double)1, val);
}

[Fact]
public void Average8()
{
var val = (new double?[] { 0, 2, 1 }).AsQueryable().Average();
var val = new double?[] { 0, 2, 1 }.AsQueryable().Average();
Assert.Equal((double)1, val);
}

[Fact]
public void Average9()
{
var val = (new decimal[] { 0, 2, 1 }).AsQueryable().Average();
var val = new decimal[] { 0, 2, 1 }.AsQueryable().Average();
Assert.Equal((decimal)1, val);
}

[Fact]
public void Average10()
{
var val = (new decimal?[] { 0, 2, 1 }).AsQueryable().Average();
var val = new decimal?[] { 0, 2, 1 }.AsQueryable().Average();
Assert.Equal((decimal)1, val);
}

[Fact]
public void Average11()
{
var val = (new int[] { 0, 2, 1 }).AsQueryable().Average(n => n);
var val = new[] { 0, 2, 1 }.AsQueryable().Average(n => n);
Assert.Equal((double)1, val);
}

[Fact]
public void Average12()
{
var val = (new int?[] { 0, 2, 1 }).AsQueryable().Average(n => n);
var val = new int?[] { 0, 2, 1 }.AsQueryable().Average(n => n);
Assert.Equal((double)1, val);
}

[Fact]
public void Average13()
{
var val = (new long[] { 0, 2, 1 }).AsQueryable().Average(n => n);
var val = new long[] { 0, 2, 1 }.AsQueryable().Average(n => n);
Assert.Equal((double)1, val);
}

[Fact]
public void Average14()
{
var val = (new long?[] { 0, 2, 1 }).AsQueryable().Average(n => n);
var val = new long?[] { 0, 2, 1 }.AsQueryable().Average(n => n);
Assert.Equal((double)1, val);
}

[Fact]
public void Average15()
{
var val = (new float[] { 0, 2, 1 }).AsQueryable().Average(n => n);
var val = new float[] { 0, 2, 1 }.AsQueryable().Average(n => n);
Assert.Equal((float)1, val);
}

[Fact]
public void Average16()
{
var val = (new float?[] { 0, 2, 1 }).AsQueryable().Average(n => n);
var val = new float?[] { 0, 2, 1 }.AsQueryable().Average(n => n);
Assert.Equal((float)1, val);
}

[Fact]
public void Average17()
{
var val = (new double[] { 0, 2, 1 }).AsQueryable().Average(n => n);
var val = new double[] { 0, 2, 1 }.AsQueryable().Average(n => n);
Assert.Equal((double)1, val);
}

[Fact]
public void Average18()
{
var val = (new double?[] { 0, 2, 1 }).AsQueryable().Average(n => n);
var val = new double?[] { 0, 2, 1 }.AsQueryable().Average(n => n);
Assert.Equal((double)1, val);
}

[Fact]
public void Average19()
{
var val = (new decimal[] { 0, 2, 1 }).AsQueryable().Average(n => n);
var val = new decimal[] { 0, 2, 1 }.AsQueryable().Average(n => n);
Assert.Equal((decimal)1, val);
}

[Fact]
public void Average20()
{
var val = (new decimal?[] { 0, 2, 1 }).AsQueryable().Average(n => n);
var val = new decimal?[] { 0, 2, 1 }.AsQueryable().Average(n => n);
Assert.Equal((decimal)1, val);
}
}
Expand Down
14 changes: 7 additions & 7 deletions src/libraries/System.Linq.Queryable/tests/CastTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ public void ThrowOnUncastableItem()
[Fact]
public void ThrowCastingIntToDouble()
{
int[] source = new int[] { -4, 1, 2, 9 };
int[] source = { -4, 1, 2, 9 };

IQueryable<double> cast = source.AsQueryable().Cast<double>();
Assert.Throws<InvalidCastException>(() => cast.ToList());
Expand Down Expand Up @@ -159,7 +159,7 @@ public void NullableIntFromNullsAndInts()
[Fact]
public void ThrowCastingIntToLong()
{
int[] source = new int[] { -4, 1, 2, 3, 9 };
int[] source = { -4, 1, 2, 3, 9 };

IQueryable<long> cast = source.AsQueryable().Cast<long>();
Assert.Throws<InvalidCastException>(() => cast.ToList());
Expand All @@ -168,7 +168,7 @@ public void ThrowCastingIntToLong()
[Fact]
public void ThrowCastingIntToNullableLong()
{
int[] source = new int[] { -4, 1, 2, 3, 9 };
int[] source = { -4, 1, 2, 3, 9 };

IQueryable<long?> cast = source.AsQueryable().Cast<long?>();
Assert.Throws<InvalidCastException>(() => cast.ToList());
Expand All @@ -177,7 +177,7 @@ public void ThrowCastingIntToNullableLong()
[Fact]
public void ThrowCastingNullableIntToLong()
{
int?[] source = new int?[] { -4, 1, 2, 3, 9 };
int?[] source = { -4, 1, 2, 3, 9 };

IQueryable<long> cast = source.AsQueryable().Cast<long>();
Assert.Throws<InvalidCastException>(() => cast.ToList());
Expand All @@ -186,7 +186,7 @@ public void ThrowCastingNullableIntToLong()
[Fact]
public void ThrowCastingNullableIntToNullableLong()
{
int?[] source = new int?[] { -4, 1, 2, 3, 9, null };
int?[] source = { -4, 1, 2, 3, 9, null };

IQueryable<long?> cast = source.AsQueryable().Cast<long?>();
Assert.Throws<InvalidCastException>(() => cast.ToList());
Expand All @@ -195,7 +195,7 @@ public void ThrowCastingNullableIntToNullableLong()
[Fact]
public void CastingNullToNonnullableIsNullReferenceException()
{
int?[] source = new int?[] { -4, 1, null, 3 };
int?[] source = { -4, 1, null, 3 };
IQueryable<int> cast = source.AsQueryable().Cast<int>();
Assert.Throws<NullReferenceException>(() => cast.ToList());
}
Expand All @@ -209,7 +209,7 @@ public void NullSource()
[Fact]
public void Cast()
{
var count = (new object[] { 0, 1, 2 }).AsQueryable().Cast<int>().Count();
var count = new object[] { 0, 1, 2 }.AsQueryable().Cast<int>().Count();
Assert.Equal(3, count);
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/libraries/System.Linq.Queryable/tests/ConcatTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ public void SecondNull()
[Fact]
public void Concat()
{
var count = (new int[] { 0, 1, 2 }).AsQueryable().Concat((new int[] { 10, 11, 12 }).AsQueryable()).Count();
var count = new[] { 0, 1, 2 }.AsQueryable().Concat(new[] { 10, 11, 12 }.AsQueryable()).Count();
Assert.Equal(6, count);
}
}
Expand Down
4 changes: 2 additions & 2 deletions src/libraries/System.Linq.Queryable/tests/ContainsTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -62,14 +62,14 @@ public void NullSource()
[Fact]
public void Contains1()
{
var val = (new int[] { 0, 2, 1 }).AsQueryable().Contains(1);
var val = new[] { 0, 2, 1 }.AsQueryable().Contains(1);
Assert.True(val);
}

[Fact]
public void Contains2()
{
var val = (new int[] { 0, 2, 1 }).AsQueryable().Contains(1, EqualityComparer<int>.Default);
var val = new[] { 0, 2, 1 }.AsQueryable().Contains(1, EqualityComparer<int>.Default);
Assert.True(val);
}
}
Expand Down
4 changes: 2 additions & 2 deletions src/libraries/System.Linq.Queryable/tests/CountTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -56,14 +56,14 @@ public void NullPredicateUsed()
[Fact]
public void Count1()
{
var count = (new int[] { 0 }).AsQueryable().Count();
var count = new[] { 0 }.AsQueryable().Count();
Assert.Equal(1, count);
}

[Fact]
public void Count2()
{
var count = (new int[] { 0, 1, 2 }).AsQueryable().Count(n => n > 0);
var count = new[] { 0, 1, 2 }.AsQueryable().Count(n => n > 0);
Assert.Equal(2, count);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,14 +65,14 @@ public void NullSource()
[Fact]
public void DefaultIfEmpty1()
{
var count = (new int[] { }).AsQueryable().DefaultIfEmpty().Count();
var count = new int[] { }.AsQueryable().DefaultIfEmpty().Count();
Assert.Equal(1, count);
}

[Fact]
public void DefaultIfEmpty2()
{
var count = (new int[] { }).AsQueryable().DefaultIfEmpty(3).Count();
var count = new int[] { }.AsQueryable().DefaultIfEmpty(3).Count();
Assert.Equal(1, count);
}

Expand Down
4 changes: 2 additions & 2 deletions src/libraries/System.Linq.Queryable/tests/DistinctTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -68,14 +68,14 @@ public void NullSourceCustomComparer()
[Fact]
public void Distinct1()
{
var count = (new int[] { 0, 1, 2, 2, 0 }).AsQueryable().Distinct().Count();
var count = new[] { 0, 1, 2, 2, 0 }.AsQueryable().Distinct().Count();
Assert.Equal(3, count);
}

[Fact]
public void Distinct2()
{
var count = (new int[] { 0, 1, 2, 2, 0 }).AsQueryable().Distinct(EqualityComparer<int>.Default).Count();
var count = new[] { 0, 1, 2, 2, 0 }.AsQueryable().Distinct(EqualityComparer<int>.Default).Count();
Assert.Equal(3, count);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public void InappropriateExpressionType()
public void WrapsEnumerableInExpression()
{
int[] source = { 1, 2, 3 };
IQueryable<int> query = (source).AsQueryable();
IQueryable<int> query = source.AsQueryable();
var exp = (ConstantExpression)query.Expression;
Assert.Equal(source, (IEnumerable<int>)exp.Value);
}
Expand Down
4 changes: 2 additions & 2 deletions src/libraries/System.Linq.Queryable/tests/ExceptTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -76,14 +76,14 @@ public void SecondNullNoComparer()
[Fact]
public void Except1()
{
var count = (new int[] { 0, 1, 2 }).AsQueryable().Except((new int[] { 1, 2, 3 }).AsQueryable()).Count();
var count = new[] { 0, 1, 2 }.AsQueryable().Except(new[] { 1, 2, 3 }.AsQueryable()).Count();
Assert.Equal(1, count);
}

[Fact]
public void Except2()
{
var count = (new int[] { 0, 1, 2 }).AsQueryable().Except((new int[] { 1, 2, 3 }).AsQueryable(), EqualityComparer<int>.Default).Count();
var count = new[] { 0, 1, 2 }.AsQueryable().Except(new[] { 1, 2, 3 }.AsQueryable(), EqualityComparer<int>.Default).Count();
Assert.Equal(1, count);
}

Expand Down
Loading

0 comments on commit 76e2be8

Please sign in to comment.