Skip to content

Commit ca622f4

Browse files
committed
Solved issue #130
1 parent 618c791 commit ca622f4

File tree

7 files changed

+46
-13
lines changed

7 files changed

+46
-13
lines changed

appveyor.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
os: Visual Studio 2017
22

3-
version: 1.0.7.{build}
3+
version: 1.0.8.{build}
44

55
configuration:
66
- Debug

src/EntityFramework.DynamicLinq/EntityFramework.DynamicLinq.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<PropertyGroup>
33
<Description>Dynamic Linq extensions for EntityFramework which adds Async support</Description>
44
<AssemblyTitle>EntityFramework.DynamicLinq</AssemblyTitle>
5-
<VersionPrefix>1.0.8.1</VersionPrefix>
5+
<VersionPrefix>1.0.8.2</VersionPrefix>
66
<Authors>Stef Heyenrath</Authors>
77
<TargetFrameworks>net45;net46</TargetFrameworks>
88
<DefineConstants>EF</DefineConstants>

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<PropertyGroup>
33
<Description>Dynamic Linq extensions for Microsoft.EntityFrameworkCore which adds Async support</Description>
44
<AssemblyTitle>Microsoft.EntityFrameworkCore.DynamicLinq</AssemblyTitle>
5-
<VersionPrefix>1.0.8.1</VersionPrefix>
5+
<VersionPrefix>1.0.8.2</VersionPrefix>
66
<Authors>Stef Heyenrath</Authors>
77
<TargetFrameworks>net451;net46;netstandard1.3;netstandard2.0;uap10.0</TargetFrameworks>
88
<DefineConstants>$(DefineConstants);EFCORE</DefineConstants>

src/System.Linq.Dynamic.Core/DynamicQueryableExtensions.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1648,9 +1648,9 @@ public static IQueryable Where([NotNull] this IQueryable source, [CanBeNull] Par
16481648
Check.NotEmpty(predicate, nameof(predicate));
16491649

16501650
bool createParameterCtor = source.IsLinqToObjects();
1651-
LambdaExpression lambda = DynamicExpressionParser.ParseLambda(config, createParameterCtor, source.ElementType, typeof(bool), predicate, args);
1651+
LambdaExpression lambda = DynamicExpressionParser.ParseLambda(config, createParameterCtor, source.ElementType, null, predicate, args);
16521652

1653-
var optimized = OptimizeExpression(Expression.Call(typeof(Queryable), "Where", new[] { source.ElementType }, source.Expression, Expression.Quote(lambda)));
1653+
var optimized = OptimizeExpression(Expression.Call(typeof(Queryable), nameof(Queryable.Where), new[] { source.ElementType }, source.Expression, Expression.Quote(lambda)));
16541654
return source.Provider.CreateQuery(optimized);
16551655
}
16561656

src/System.Linq.Dynamic.Core/System.Linq.Dynamic.Core.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<PropertyGroup>
33
<Description>This is a .NETStandard/ .NET Core port of the the Microsoft assembly for the .Net 4.0 Dynamic language functionality.</Description>
44
<AssemblyTitle>System.Linq.Dynamic.Core</AssemblyTitle>
5-
<VersionPrefix>1.0.8.1</VersionPrefix>
5+
<VersionPrefix>1.0.8.2</VersionPrefix>
66
<Authors>Microsoft;Scott Guthrie;King Wilder;Nathan Arnott;Stef Heyenrath</Authors>
77
<TargetFrameworks>net35;net40;net45;net46;uap10.0;netstandard1.3;netstandard2.0</TargetFrameworks>
88
<GenerateDocumentationFile>true</GenerateDocumentationFile>
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,57 @@
1-
using System.Collections.Generic;
1+
using System.Collections;
2+
using System.Collections.Generic;
23
using System.Linq.Dynamic.Core.Tests.Helpers.Models;
4+
using System.Reflection;
35
using Xunit;
46

57
namespace System.Linq.Dynamic.Core.Tests
68
{
79
public partial class QueryableTests
810
{
911
[Fact]
10-
public void Contains_Dynamic_StringList()
12+
public void Contains_Dynamic_ListWithStrings()
1113
{
12-
//Arrange
14+
// Arrange
1315
var baseQuery = User.GenerateSampleModels(100).AsQueryable();
1416
var list = new List<string> { "User1", "User5", "User10" };
1517

16-
//Act
18+
// Act
1719
var realQuery = baseQuery.Where(x => list.Contains(x.UserName)).Select(x => x.Id);
1820
var testQuery = baseQuery.Where("@0.Contains(UserName)", list).Select("Id");
1921

20-
//Assert
22+
// Assert
2123
Assert.Equal(realQuery.ToArray(), testQuery.Cast<Guid>().ToArray());
2224
}
25+
26+
[Fact]
27+
[Trait("Issue", "130")]
28+
public void Contains_Dynamic_ListWithDynamicObjects()
29+
{
30+
// Arrange
31+
var baseQuery = User.GenerateSampleModels(100).AsQueryable();
32+
var list = new List<dynamic> { new { UserName = "User1" } };
33+
34+
var keyType = DynamicClassFactory.CreateType(new[] { new DynamicProperty("UserName", typeof(string)) });
35+
var keyVals = (IList)CreateGenericInstance(typeof(List<>), new[] { keyType });
36+
37+
var keyVal = Activator.CreateInstance(keyType);
38+
keyType.GetProperty("UserName").SetValue(keyVal, "User1");
39+
keyVals.Add(keyVal);
40+
41+
// Act
42+
var realQuery = baseQuery.Where(x => list.Contains(new { UserName = x.UserName })).Select(x => x.Id);
43+
var testQuery = baseQuery.Where("@0.Contains(new(it.UserName as UserName))", keyVals).Select("Id");
44+
45+
// Assert
46+
Assert.Equal(realQuery.ToArray(), testQuery.Cast<Guid>().ToArray());
47+
}
48+
49+
private object CreateGenericInstance(Type type, Type[] types, params dynamic[] ctorParams)
50+
{
51+
Type genType = type.MakeGenericType(types);
52+
53+
var constructor = genType.GetConstructors().First();
54+
return constructor.Invoke(ctorParams);
55+
}
2356
}
24-
}
57+
}

test/System.Linq.Dynamic.Core.Tests/QueryableTests.Where.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ public void Where_Dynamic_Exceptions()
122122
var qry = testList.AsQueryable();
123123

124124
//Act
125-
Assert.Throws<ParseException>(() => qry.Where("Id"));
125+
Assert.Throws<InvalidOperationException>(() => qry.Where("Id"));
126126
Assert.Throws<ParseException>(() => qry.Where("Bad=3"));
127127
Assert.Throws<ParseException>(() => qry.Where("Id=123"));
128128

0 commit comments

Comments
 (0)