diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d27c1f6..341f260e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,16 @@ +# 1.0.8.2 (09 January 2018) + + - [#130](https://github.com/StefH/System.Linq.Dynamic.Core/issues/130) - BUG: Dynamic new in Where() causes NRE + +Commits: ca622f4e71...ca622f4e71 + + # 1.0.8.1 (05 January 2018) - [#135](https://github.com/StefH/System.Linq.Dynamic.Core/pull/135) - Add DbGeography to predefined types to allow advanced spatial queries. contributed by ([czielin](https://github.com/czielin)) - [#134](https://github.com/StefH/System.Linq.Dynamic.Core/issues/134) - Accessing DbGeography methods/properties - [#129](https://github.com/StefH/System.Linq.Dynamic.Core/issues/129) - ToDynamicList/ToDynamicArray cannot actually cast to specified type in .net core 2 +fix - + Commits: e584361eaa...e584361eaa diff --git a/ChangeLog.txt b/ChangeLog.txt index e1968bfe..96698dfc 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -1,5 +1,5 @@ https://github.com/GitTools/GitReleaseNotes -GitReleaseNotes.exe . /OutputFile CHANGELOG.md /Version 1.0.8.1 +GitReleaseNotes.exe . /OutputFile CHANGELOG.md /Version 1.0.8.2 GitReleaseNotes.exe . /OutputFile CHANGELOG.md /allTags diff --git a/appveyor.yml b/appveyor.yml index 1888383f..99a6b7a0 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,6 +1,6 @@ os: Visual Studio 2017 -version: 1.0.7.{build} +version: 1.0.8.{build} configuration: - Debug diff --git a/src/EntityFramework.DynamicLinq/EntityFramework.DynamicLinq.csproj b/src/EntityFramework.DynamicLinq/EntityFramework.DynamicLinq.csproj index a88ea89c..abc88485 100644 --- a/src/EntityFramework.DynamicLinq/EntityFramework.DynamicLinq.csproj +++ b/src/EntityFramework.DynamicLinq/EntityFramework.DynamicLinq.csproj @@ -2,7 +2,7 @@ Dynamic Linq extensions for EntityFramework which adds Async support EntityFramework.DynamicLinq - 1.0.8.1 + 1.0.8.2 Stef Heyenrath net45;net46 EF diff --git a/src/Microsoft.EntityFrameworkCore.DynamicLinq/Microsoft.EntityFrameworkCore.DynamicLinq.csproj b/src/Microsoft.EntityFrameworkCore.DynamicLinq/Microsoft.EntityFrameworkCore.DynamicLinq.csproj index 91d33111..51888fb9 100644 --- a/src/Microsoft.EntityFrameworkCore.DynamicLinq/Microsoft.EntityFrameworkCore.DynamicLinq.csproj +++ b/src/Microsoft.EntityFrameworkCore.DynamicLinq/Microsoft.EntityFrameworkCore.DynamicLinq.csproj @@ -2,7 +2,7 @@ Dynamic Linq extensions for Microsoft.EntityFrameworkCore which adds Async support Microsoft.EntityFrameworkCore.DynamicLinq - 1.0.8.1 + 1.0.8.2 Stef Heyenrath net451;net46;netstandard1.3;netstandard2.0;uap10.0 $(DefineConstants);EFCORE diff --git a/src/System.Linq.Dynamic.Core/DynamicQueryableExtensions.cs b/src/System.Linq.Dynamic.Core/DynamicQueryableExtensions.cs index fc6b593f..cdbcf69d 100644 --- a/src/System.Linq.Dynamic.Core/DynamicQueryableExtensions.cs +++ b/src/System.Linq.Dynamic.Core/DynamicQueryableExtensions.cs @@ -1648,9 +1648,9 @@ public static IQueryable Where([NotNull] this IQueryable source, [CanBeNull] Par Check.NotEmpty(predicate, nameof(predicate)); bool createParameterCtor = source.IsLinqToObjects(); - LambdaExpression lambda = DynamicExpressionParser.ParseLambda(config, createParameterCtor, source.ElementType, typeof(bool), predicate, args); + LambdaExpression lambda = DynamicExpressionParser.ParseLambda(config, createParameterCtor, source.ElementType, null, predicate, args); - var optimized = OptimizeExpression(Expression.Call(typeof(Queryable), "Where", new[] { source.ElementType }, source.Expression, Expression.Quote(lambda))); + var optimized = OptimizeExpression(Expression.Call(typeof(Queryable), nameof(Queryable.Where), new[] { source.ElementType }, source.Expression, Expression.Quote(lambda))); return source.Provider.CreateQuery(optimized); } diff --git a/src/System.Linq.Dynamic.Core/System.Linq.Dynamic.Core.csproj b/src/System.Linq.Dynamic.Core/System.Linq.Dynamic.Core.csproj index 16307320..be5e7298 100644 --- a/src/System.Linq.Dynamic.Core/System.Linq.Dynamic.Core.csproj +++ b/src/System.Linq.Dynamic.Core/System.Linq.Dynamic.Core.csproj @@ -2,7 +2,7 @@ This is a .NETStandard/ .NET Core port of the the Microsoft assembly for the .Net 4.0 Dynamic language functionality. System.Linq.Dynamic.Core - 1.0.8.1 + 1.0.8.2 Microsoft;Scott Guthrie;King Wilder;Nathan Arnott;Stef Heyenrath net35;net40;net45;net46;uap10.0;netstandard1.3;netstandard2.0 true diff --git a/test/System.Linq.Dynamic.Core.Tests/QueryableTests.Contains.cs b/test/System.Linq.Dynamic.Core.Tests/QueryableTests.Contains.cs index a2d35508..61516c8c 100644 --- a/test/System.Linq.Dynamic.Core.Tests/QueryableTests.Contains.cs +++ b/test/System.Linq.Dynamic.Core.Tests/QueryableTests.Contains.cs @@ -1,5 +1,7 @@ -using System.Collections.Generic; +using System.Collections; +using System.Collections.Generic; using System.Linq.Dynamic.Core.Tests.Helpers.Models; +using System.Reflection; using Xunit; namespace System.Linq.Dynamic.Core.Tests @@ -7,18 +9,49 @@ namespace System.Linq.Dynamic.Core.Tests public partial class QueryableTests { [Fact] - public void Contains_Dynamic_StringList() + public void Contains_Dynamic_ListWithStrings() { - //Arrange + // Arrange var baseQuery = User.GenerateSampleModels(100).AsQueryable(); var list = new List { "User1", "User5", "User10" }; - //Act + // Act var realQuery = baseQuery.Where(x => list.Contains(x.UserName)).Select(x => x.Id); var testQuery = baseQuery.Where("@0.Contains(UserName)", list).Select("Id"); - //Assert + // Assert Assert.Equal(realQuery.ToArray(), testQuery.Cast().ToArray()); } + + [Fact] + [Trait("Issue", "130")] + public void Contains_Dynamic_ListWithDynamicObjects() + { + // Arrange + var baseQuery = User.GenerateSampleModels(100).AsQueryable(); + var list = new List { new { UserName = "User1" } }; + + var keyType = DynamicClassFactory.CreateType(new[] { new DynamicProperty("UserName", typeof(string)) }); + var keyVals = (IList)CreateGenericInstance(typeof(List<>), new[] { keyType }); + + var keyVal = Activator.CreateInstance(keyType); + keyType.GetProperty("UserName").SetValue(keyVal, "User1"); + keyVals.Add(keyVal); + + // Act + var realQuery = baseQuery.Where(x => list.Contains(new { UserName = x.UserName })).Select(x => x.Id); + var testQuery = baseQuery.Where("@0.Contains(new(it.UserName as UserName))", keyVals).Select("Id"); + + // Assert + Assert.Equal(realQuery.ToArray(), testQuery.Cast().ToArray()); + } + + private object CreateGenericInstance(Type type, Type[] types, params dynamic[] ctorParams) + { + Type genType = type.MakeGenericType(types); + + var constructor = genType.GetConstructors().First(); + return constructor.Invoke(ctorParams); + } } -} \ No newline at end of file +} diff --git a/test/System.Linq.Dynamic.Core.Tests/QueryableTests.Where.cs b/test/System.Linq.Dynamic.Core.Tests/QueryableTests.Where.cs index 9bd6f093..4cc13c25 100644 --- a/test/System.Linq.Dynamic.Core.Tests/QueryableTests.Where.cs +++ b/test/System.Linq.Dynamic.Core.Tests/QueryableTests.Where.cs @@ -122,7 +122,7 @@ public void Where_Dynamic_Exceptions() var qry = testList.AsQueryable(); //Act - Assert.Throws(() => qry.Where("Id")); + Assert.Throws(() => qry.Where("Id")); Assert.Throws(() => qry.Where("Bad=3")); Assert.Throws(() => qry.Where("Id=123"));