Skip to content

Commit 1ed556d

Browse files
authored
Updated 'new' command (finding a constructor with exact argument-types and same order) (#573)
* wip * fix * . * x * ok * . * n5 * . * 6 * f * . * ci * ex f * skip * var queryable = new int[0].AsQueryable(); * #if NET5_0 || NET6_0
1 parent 24acfc4 commit 1ed556d

File tree

17 files changed

+309
-77
lines changed

17 files changed

+309
-77
lines changed

.github/workflows/ci.yml

+9-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ on: [push]
44

55
jobs:
66
build:
7-
runs-on: windows-latest
7+
runs-on: windows-2022
88

99
steps:
1010
- uses: actions/checkout@v2
@@ -13,6 +13,14 @@ jobs:
1313
run: |
1414
dotnet build ./src/System.Linq.Dynamic.Core/System.Linq.Dynamic.Core.csproj -c Release -p:buildType=azure-pipelines-ci
1515
16+
- name: Run Tests net6.0
17+
run: |
18+
dotnet test ./test/System.Linq.Dynamic.Core.Tests.Net6/System.Linq.Dynamic.Core.Tests.Net6.csproj -c Release -p:buildType=azure-pipelines-ci
19+
20+
- name: Run Tests net5.0
21+
run: |
22+
dotnet test ./test/System.Linq.Dynamic.Core.Tests.Net5/System.Linq.Dynamic.Core.Tests.Net5.csproj -c Release -p:buildType=azure-pipelines-ci
23+
1624
- name: Run Tests netcoreapp31
1725
run: |
1826
dotnet test ./test/System.Linq.Dynamic.Core.Tests/System.Linq.Dynamic.Core.Tests.csproj -c Release -f netcoreapp31 -p:buildType=azure-pipelines-ci

System.Linq.Dynamic.Core.sln

+38
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Actions", "Actions", "{A42F
117117
.github\workflows\CreateRelease.yml = .github\workflows\CreateRelease.yml
118118
EndProjectSection
119119
EndProject
120+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "System.Linq.Dynamic.Core.Tests.Net5", "test\System.Linq.Dynamic.Core.Tests.Net5\System.Linq.Dynamic.Core.Tests.Net5.csproj", "{2AC8773A-FCDD-4613-8758-E45E5F10CA3A}"
121+
EndProject
122+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "System.Linq.Dynamic.Core.Tests.Net6", "test\System.Linq.Dynamic.Core.Tests.Net6\System.Linq.Dynamic.Core.Tests.Net6.csproj", "{EDAB46DA-7079-42D7-819D-1932C542872F}"
123+
EndProject
120124
Global
121125
GlobalSection(SolutionConfigurationPlatforms) = preSolution
122126
Debug|Any CPU = Debug|Any CPU
@@ -707,6 +711,38 @@ Global
707711
{C206917D-6E90-4A31-8533-AF2DD68FF738}.Release|x64.Build.0 = Release|Any CPU
708712
{C206917D-6E90-4A31-8533-AF2DD68FF738}.Release|x86.ActiveCfg = Release|Any CPU
709713
{C206917D-6E90-4A31-8533-AF2DD68FF738}.Release|x86.Build.0 = Release|Any CPU
714+
{2AC8773A-FCDD-4613-8758-E45E5F10CA3A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
715+
{2AC8773A-FCDD-4613-8758-E45E5F10CA3A}.Debug|Any CPU.Build.0 = Debug|Any CPU
716+
{2AC8773A-FCDD-4613-8758-E45E5F10CA3A}.Debug|ARM.ActiveCfg = Debug|Any CPU
717+
{2AC8773A-FCDD-4613-8758-E45E5F10CA3A}.Debug|ARM.Build.0 = Debug|Any CPU
718+
{2AC8773A-FCDD-4613-8758-E45E5F10CA3A}.Debug|x64.ActiveCfg = Debug|Any CPU
719+
{2AC8773A-FCDD-4613-8758-E45E5F10CA3A}.Debug|x64.Build.0 = Debug|Any CPU
720+
{2AC8773A-FCDD-4613-8758-E45E5F10CA3A}.Debug|x86.ActiveCfg = Debug|Any CPU
721+
{2AC8773A-FCDD-4613-8758-E45E5F10CA3A}.Debug|x86.Build.0 = Debug|Any CPU
722+
{2AC8773A-FCDD-4613-8758-E45E5F10CA3A}.Release|Any CPU.ActiveCfg = Release|Any CPU
723+
{2AC8773A-FCDD-4613-8758-E45E5F10CA3A}.Release|Any CPU.Build.0 = Release|Any CPU
724+
{2AC8773A-FCDD-4613-8758-E45E5F10CA3A}.Release|ARM.ActiveCfg = Release|Any CPU
725+
{2AC8773A-FCDD-4613-8758-E45E5F10CA3A}.Release|ARM.Build.0 = Release|Any CPU
726+
{2AC8773A-FCDD-4613-8758-E45E5F10CA3A}.Release|x64.ActiveCfg = Release|Any CPU
727+
{2AC8773A-FCDD-4613-8758-E45E5F10CA3A}.Release|x64.Build.0 = Release|Any CPU
728+
{2AC8773A-FCDD-4613-8758-E45E5F10CA3A}.Release|x86.ActiveCfg = Release|Any CPU
729+
{2AC8773A-FCDD-4613-8758-E45E5F10CA3A}.Release|x86.Build.0 = Release|Any CPU
730+
{EDAB46DA-7079-42D7-819D-1932C542872F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
731+
{EDAB46DA-7079-42D7-819D-1932C542872F}.Debug|Any CPU.Build.0 = Debug|Any CPU
732+
{EDAB46DA-7079-42D7-819D-1932C542872F}.Debug|ARM.ActiveCfg = Debug|Any CPU
733+
{EDAB46DA-7079-42D7-819D-1932C542872F}.Debug|ARM.Build.0 = Debug|Any CPU
734+
{EDAB46DA-7079-42D7-819D-1932C542872F}.Debug|x64.ActiveCfg = Debug|Any CPU
735+
{EDAB46DA-7079-42D7-819D-1932C542872F}.Debug|x64.Build.0 = Debug|Any CPU
736+
{EDAB46DA-7079-42D7-819D-1932C542872F}.Debug|x86.ActiveCfg = Debug|Any CPU
737+
{EDAB46DA-7079-42D7-819D-1932C542872F}.Debug|x86.Build.0 = Debug|Any CPU
738+
{EDAB46DA-7079-42D7-819D-1932C542872F}.Release|Any CPU.ActiveCfg = Release|Any CPU
739+
{EDAB46DA-7079-42D7-819D-1932C542872F}.Release|Any CPU.Build.0 = Release|Any CPU
740+
{EDAB46DA-7079-42D7-819D-1932C542872F}.Release|ARM.ActiveCfg = Release|Any CPU
741+
{EDAB46DA-7079-42D7-819D-1932C542872F}.Release|ARM.Build.0 = Release|Any CPU
742+
{EDAB46DA-7079-42D7-819D-1932C542872F}.Release|x64.ActiveCfg = Release|Any CPU
743+
{EDAB46DA-7079-42D7-819D-1932C542872F}.Release|x64.Build.0 = Release|Any CPU
744+
{EDAB46DA-7079-42D7-819D-1932C542872F}.Release|x86.ActiveCfg = Release|Any CPU
745+
{EDAB46DA-7079-42D7-819D-1932C542872F}.Release|x86.Build.0 = Release|Any CPU
710746
EndGlobalSection
711747
GlobalSection(SolutionProperties) = preSolution
712748
HideSolutionNode = FALSE
@@ -748,6 +784,8 @@ Global
748784
{4CC563F6-5352-4A77-A8C0-DC0D77A71DBB} = {7971CAEB-B9F2-416B-966D-2D697C4C1E62}
749785
{C206917D-6E90-4A31-8533-AF2DD68FF738} = {7971CAEB-B9F2-416B-966D-2D697C4C1E62}
750786
{A42F1470-7801-4A19-BCA3-08AF24F3BFC5} = {25E69107-C89E-4807-AA31-C49423F0F1E3}
787+
{2AC8773A-FCDD-4613-8758-E45E5F10CA3A} = {8463ED7E-69FB-49AE-85CF-0791AFD98E38}
788+
{EDAB46DA-7079-42D7-819D-1932C542872F} = {8463ED7E-69FB-49AE-85CF-0791AFD98E38}
751789
EndGlobalSection
752790
GlobalSection(ExtensibilityGlobals) = postSolution
753791
SolutionGuid = {94C56722-194E-4B8B-BC23-B3F754E89A20}

src/EntityFramework.DynamicLinq/EntityFramework.DynamicLinq.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<Description>Dynamic Linq extensions for EntityFramework which adds Async support</Description>
77
<AssemblyTitle>EntityFramework.DynamicLinq</AssemblyTitle>
88
<Authors>ZZZ Projects;Stef Heyenrath</Authors>
9-
<TargetFrameworks>net45;net46;netstandard2.1</TargetFrameworks>
9+
<TargetFrameworks>net45;net452;net46;netstandard2.1</TargetFrameworks>
1010
<DefineConstants>EF;EFDYNAMICFUNCTIONS</DefineConstants>
1111
<GenerateDocumentationFile>true</GenerateDocumentationFile>
1212
<AssemblyName>EntityFramework.DynamicLinq</AssemblyName>

src/Microsoft.EntityFrameworkCore.DynamicLinq.EFCore3/EFDynamicQueryableExtensions.cs

+39-31
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ namespace EntityFramework.DynamicLinq
2828
/// </summary>
2929
public static class EntityFrameworkDynamicQueryableExtensions
3030
{
31+
// ReSharper disable once UseNameOfInsteadOfTypeOf
3132
private static readonly TraceSource TraceSource = new TraceSource(typeof(EntityFrameworkDynamicQueryableExtensions).Name);
3233

3334
#region AllAsync
@@ -83,9 +84,9 @@ public static Task<bool> AllAsync([NotNull] this IQueryable source, [NotNull] st
8384

8485
return ExecuteAsync<bool>(_AllPredicate, source, Expression.Quote(lambda), cancellationToken);
8586
}
86-
#endregion AllAsync
87+
#endregion AllAsync
8788

88-
#region AnyAsync
89+
#region AnyAsync
8990
private static readonly MethodInfo _any = GetMethod(nameof(Queryable.Any));
9091

9192
/// <summary>
@@ -165,10 +166,10 @@ public static Task<bool> AnyAsync([NotNull] this IQueryable source, [NotNull] st
165166

166167
return ExecuteAsync<bool>(_anyPredicate, source, Expression.Quote(lambda), cancellationToken);
167168
}
168-
#endregion AnyAsync
169+
#endregion AnyAsync
169170

170-
#region AverageAsync
171-
private static readonly MethodInfo _average = GetMethod(nameof(Queryable.Average));
171+
#region AverageAsync
172+
private static readonly MethodInfo _averageForDouble = GetMethod(nameof(Queryable.Average), 0, mi => mi.ReturnType == typeof(double));
172173

173174
/// <summary>
174175
/// Asynchronously computes the average of a sequence of values.
@@ -192,10 +193,10 @@ public static Task<bool> AnyAsync([NotNull] this IQueryable source, [NotNull] st
192193
Check.NotNull(source, nameof(source));
193194
Check.NotNull(cancellationToken, nameof(cancellationToken));
194195

195-
return ExecuteAsync<double>(_average, source, cancellationToken);
196+
return ExecuteAsync<double>(_averageForDouble, source, cancellationToken);
196197
}
197198

198-
private static readonly MethodInfo _averagePredicate = GetMethod(nameof(Queryable.Average), 1);
199+
private static readonly MethodInfo _averagePredicateForDouble = GetMethod(nameof(Queryable.Average), 1, mi => mi.ReturnType == typeof(double));
199200

200201
/// <summary>
201202
/// Asynchronously computes the average of a sequence of values that is obtained by invoking a projection function on each element of the input sequence.
@@ -249,11 +250,11 @@ public static Task<double> AverageAsync([NotNull] this IQueryable source, [NotNu
249250

250251
LambdaExpression lambda = DynamicExpressionParser.ParseLambda(false, source.ElementType, null, selector, args);
251252

252-
return ExecuteAsync<double>(_averagePredicate, source, Expression.Quote(lambda), cancellationToken);
253+
return ExecuteAsync<double>(_averagePredicateForDouble, source, Expression.Quote(lambda), cancellationToken);
253254
}
254-
#endregion AverageAsync
255+
#endregion AverageAsync
255256

256-
#region Count
257+
#region Count
257258
private static readonly MethodInfo _count = GetMethod(nameof(Queryable.Count));
258259

259260
/// <summary>
@@ -338,9 +339,9 @@ public static Task<int> CountAsync([NotNull] this IQueryable source, Cancellatio
338339

339340
return ExecuteAsync<int>(_countPredicate, source, Expression.Quote(lambda), cancellationToken);
340341
}
341-
#endregion Count
342+
#endregion Count
342343

343-
#region FirstAsync
344+
#region FirstAsync
344345
private static readonly MethodInfo _first = GetMethod(nameof(Queryable.First));
345346

346347
/// <summary>
@@ -423,9 +424,9 @@ public static Task<dynamic> FirstAsync([NotNull] this IQueryable source, Cancell
423424

424425
return ExecuteAsync<dynamic>(_firstPredicate, source, Expression.Quote(lambda), cancellationToken);
425426
}
426-
#endregion FirstAsync
427+
#endregion FirstAsync
427428

428-
#region FirstOrDefaultAsync
429+
#region FirstOrDefaultAsync
429430
private static readonly MethodInfo _firstOrDefault = GetMethod(nameof(Queryable.FirstOrDefault));
430431

431432
/// <summary>
@@ -455,7 +456,7 @@ public static Task<dynamic> FirstAsync([NotNull] this IQueryable source, Cancell
455456
return ExecuteAsync<dynamic>(_firstOrDefault, source, cancellationToken);
456457
}
457458

458-
private static readonly MethodInfo _firstOrDefaultPredicate = GetMethod(nameof(Queryable.FirstOrDefault), 1);
459+
private static readonly MethodInfo _firstOrDefaultPredicate = GetMethod(nameof(Queryable.FirstOrDefault), 1, mi => mi.GetParameters()[1].Name == "predicate");
459460

460461
/// <summary>
461462
/// Asynchronously returns the first element of a sequence that satisfies a specified condition
@@ -515,9 +516,9 @@ public static Task<dynamic> FirstOrDefaultAsync([NotNull] this IQueryable source
515516

516517
return ExecuteAsync<dynamic>(_firstOrDefaultPredicate, source, Expression.Quote(lambda), cancellationToken);
517518
}
518-
#endregion FirstOrDefault
519+
#endregion FirstOrDefault
519520

520-
#region LastAsync
521+
#region LastAsync
521522
private static readonly MethodInfo _last = GetMethod(nameof(Queryable.Last));
522523

523524
/// <summary>
@@ -600,9 +601,9 @@ public static Task<dynamic> LastAsync([NotNull] this IQueryable source, Cancella
600601

601602
return ExecuteAsync<dynamic>(_lastPredicate, source, Expression.Quote(lambda), cancellationToken);
602603
}
603-
#endregion LastAsync
604+
#endregion LastAsync
604605

605-
#region LastOrDefaultAsync
606+
#region LastOrDefaultAsync
606607
private static readonly MethodInfo _lastOrDefault = GetMethod(nameof(Queryable.LastOrDefault));
607608

608609
/// <summary>
@@ -692,9 +693,9 @@ public static Task<dynamic> LastOrDefaultAsync([NotNull] this IQueryable source,
692693

693694
return ExecuteAsync<dynamic>(_lastOrDefaultPredicate, source, Expression.Quote(lambda), cancellationToken);
694695
}
695-
#endregion LastOrDefault
696+
#endregion LastOrDefault
696697

697-
#region LongCount
698+
#region LongCount
698699
private static readonly MethodInfo _longCount = GetMethod(nameof(Queryable.LongCount));
699700

700701
/// <summary>
@@ -779,9 +780,9 @@ public static Task<long> LongCountAsync([NotNull] this IQueryable source, Cancel
779780

780781
return ExecuteAsync<long>(_longCountPredicate, source, Expression.Quote(lambda), cancellationToken);
781782
}
782-
#endregion LongCount
783+
#endregion LongCount
783784

784-
#region SingleOrDefaultAsync
785+
#region SingleOrDefaultAsync
785786
private static readonly MethodInfo _singleOrDefault = GetMethod(nameof(Queryable.SingleOrDefault));
786787

787788
/// <summary>
@@ -810,7 +811,7 @@ public static Task<long> LongCountAsync([NotNull] this IQueryable source, Cancel
810811
return ExecuteAsync<dynamic>(_singleOrDefault, source, cancellationToken);
811812
}
812813

813-
private static readonly MethodInfo _singleOrDefaultPredicate = GetMethod(nameof(Queryable.SingleOrDefault), 1);
814+
private static readonly MethodInfo _singleOrDefaultPredicate = GetMethod(nameof(Queryable.SingleOrDefault), 1, mi => mi.GetParameters()[1].Name == "predicate");
814815

815816
/// <summary>
816817
/// Asynchronously returns the only element of a sequence that satisfies a specified condition or a default value if no such element exists.
@@ -864,9 +865,9 @@ public static Task<dynamic> SingleOrDefaultAsync([NotNull] this IQueryable sourc
864865

865866
return ExecuteAsync<dynamic>(_singleOrDefaultPredicate, source, Expression.Quote(lambda), cancellationToken);
866867
}
867-
#endregion SingleOrDefault
868+
#endregion SingleOrDefault
868869

869-
#region SumAsync
870+
#region SumAsync
870871
/// <summary>
871872
/// Asynchronously computes the sum of a sequence of values.
872873
/// </summary>
@@ -950,9 +951,9 @@ public static Task<dynamic> SumAsync([NotNull] this IQueryable source, Cancellat
950951

951952
return ExecuteDynamicAsync(sumSelector, source, Expression.Quote(lambda), cancellationToken);
952953
}
953-
#endregion SumAsync
954+
#endregion SumAsync
954955

955-
#region Private Helpers
956+
#region Private Helpers
956957
private static readonly MethodInfo _executeAsyncMethod =
957958
typeof(EntityFrameworkDynamicQueryableExtensions)
958959
#if NETSTANDARD || UAP10_0
@@ -1057,8 +1058,15 @@ private static MethodInfo GetMethod<TResult>(string name, int parameterCount = 0
10571058
private static MethodInfo GetMethod(string name, Type returnType, int parameterCount = 0, Func<MethodInfo, bool> predicate = null) =>
10581059
GetMethod(name, parameterCount, mi => (mi.ReturnType == returnType) && ((predicate == null) || predicate(mi)));
10591060

1060-
private static MethodInfo GetMethod(string name, int parameterCount = 0, Func<MethodInfo, bool> predicate = null) =>
1061-
typeof(Queryable).GetTypeInfo().GetDeclaredMethods(name).First(mi => (mi.GetParameters().Length == parameterCount + 1) && ((predicate == null) || predicate(mi)));
1061+
private static MethodInfo GetMethod(
1062+
string name,
1063+
int parameterCount = 0,
1064+
Func<MethodInfo, bool> predicate = null) =>
1065+
typeof(Queryable)
1066+
.GetTypeInfo()
1067+
.GetDeclaredMethods(name)
1068+
.Where(mi => mi.GetParameters().Length == parameterCount + 1)
1069+
.First(mi => predicate == null || predicate(mi));
10621070

10631071
#if EFCORE_3X
10641072
private static IQueryable CastSource(IQueryable source, MethodInfo operatorMethodInfo)
@@ -1106,6 +1114,6 @@ private static Expression OptimizeExpression(Expression expression)
11061114

11071115
return expression;
11081116
}
1109-
#endregion Private Helpers
1117+
#endregion Private Helpers
11101118
}
11111119
}

src/Microsoft.EntityFrameworkCore.DynamicLinq.EFCore5/Microsoft.EntityFrameworkCore.DynamicLinq.EFCore5.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
</PropertyGroup>
4242

4343
<PropertyGroup Condition=" '$(buildType)' == 'azure-pipelines-ci' ">
44-
<TargetFrameworks>netstandard2.1</TargetFrameworks>
44+
<TargetFrameworks>netstandard2.1;net5.0</TargetFrameworks>
4545
</PropertyGroup>
4646

4747
<ItemGroup>

src/Microsoft.EntityFrameworkCore.DynamicLinq.EFCore6/Microsoft.EntityFrameworkCore.DynamicLinq.EFCore6.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
</PropertyGroup>
4242

4343
<PropertyGroup Condition=" '$(buildType)' == 'azure-pipelines-ci' ">
44-
<TargetFrameworks>net5.0</TargetFrameworks>
44+
<TargetFrameworks>net6.0</TargetFrameworks>
4545
</PropertyGroup>
4646

4747
<ItemGroup>

0 commit comments

Comments
 (0)