Skip to content

Commit 8933b95

Browse files
authored
Fix SelectMany when using JArray (#585)
1 parent 9fc7479 commit 8933b95

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
lines changed

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

+3-1
Original file line numberDiff line numberDiff line change
@@ -1927,11 +1927,13 @@ private static IQueryable SelectManyInternal(IQueryable source, ParsingConfig co
19271927
// lambda.Body.Type.GetGenericArguments()[0] when used over an array as GetGenericArguments() returns an empty array.
19281928
if (lambda.Body.Type.IsArray)
19291929
{
1930+
// In case of an Array, get the type via GetElementType().
19301931
resultType = lambda.Body.Type.GetElementType();
19311932
}
19321933
else
19331934
{
1934-
resultType = lambda.Body.Type.GetGenericArguments()[0];
1935+
var genericArguments = lambda.Body.Type.GetGenericArguments();
1936+
resultType = genericArguments.Any() ? genericArguments[0] : typeof(object);
19351937
}
19361938
}
19371939

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

+33
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
using System.Collections;
22
using System.Collections.Generic;
33
using System.Linq.Dynamic.Core.Tests.Helpers.Models;
4+
using FluentAssertions;
5+
using Newtonsoft.Json.Linq;
46
using Xunit;
57

68
namespace System.Linq.Dynamic.Core.Tests
@@ -103,6 +105,22 @@ public void SelectMany_Dynamic_IntoType()
103105
Assert.Equal(queryNormal, queryDynamic);
104106
}
105107

108+
[Fact]
109+
public void SelectMany_Dynamic_OverJArray_TResult()
110+
{
111+
// Arrange
112+
var array1 = JArray.Parse("[1,2,3]");
113+
var array2 = JArray.Parse("[4,5,6]");
114+
115+
// Act
116+
var expectedResult = new[] { array1, array2 }.SelectMany(it => it).ToArray();
117+
var result = new[] { array1, array2 }.AsQueryable().SelectMany("it").ToDynamicArray<JToken>();
118+
119+
// Assert
120+
result.Should().BeEquivalentTo(expectedResult);
121+
// result.Should().HaveCount(6).And.Subject.Select(j => j.Value).Should().ContainInOrder(new[] { 1, 2, 3, 4, 5, 6 });
122+
}
123+
106124
[Fact]
107125
public void SelectMany_Dynamic_OverArray_TResult()
108126
{
@@ -119,6 +137,21 @@ public void SelectMany_Dynamic_OverArray_TResult()
119137
Assert.Equal(expectedResult, result);
120138
}
121139

140+
[Fact]
141+
public void SelectMany_Dynamic_OverArray_Int()
142+
{
143+
var testList = new[]
144+
{
145+
new[] { 1, 2, 3 },
146+
new[] { 4, 5, 6 }
147+
};
148+
149+
var expectedResult = testList.SelectMany(it => it).ToList();
150+
var result = testList.AsQueryable().SelectMany<int>("it").ToList();
151+
152+
Assert.Equal(expectedResult, result);
153+
}
154+
122155
[Fact]
123156
public void SelectMany_Dynamic_OverArray_IntoType()
124157
{

0 commit comments

Comments
 (0)