Skip to content

Commit 4728e38

Browse files
committed
SkipAndTake (#15)
1 parent b60801a commit 4728e38

File tree

2 files changed

+32
-2
lines changed

2 files changed

+32
-2
lines changed

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

+4-2
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,8 @@ interface IEnumerableSignatures
183183
void OrderBy(object selector);
184184
void OrderByDescending(object selector);
185185
void Contains(object selector);
186+
void Skip(int count);
187+
void Take(int count);
186188

187189
//Executors
188190
void Single();
@@ -1389,7 +1391,7 @@ Expression ParseAggregate(Expression instance, Type elementType, string methodNa
13891391

13901392
_parent = _it;
13911393

1392-
if (methodName == "Contains")
1394+
if (methodName == "Contains" || methodName == "Skip" || methodName == "Take")
13931395
{
13941396
//for any method that acts on the parent element type, we need to specify the outerIt as scope.
13951397
_it = outerIt;
@@ -1426,7 +1428,7 @@ Expression ParseAggregate(Expression instance, Type elementType, string methodNa
14261428
typeArgs = new[] { elementType };
14271429
}
14281430

1429-
if (signature.Name == "Contains")
1431+
if (signature.Name == "Contains" || signature.Name == "Take" || signature.Name == "Skip")
14301432
{
14311433
args = new[] { instance, args[0] };
14321434
}

test/System.Linq.Dynamic.Core.Tests/ExpressionTests.cs

+28
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,34 @@ namespace System.Linq.Dynamic.Core.Tests
88
{
99
public class ExpressionTests
1010
{
11+
[Fact]
12+
public void ExpressionTests_SkipAndTake()
13+
{
14+
//Arrange
15+
var samples = User.GenerateSampleModels(3);
16+
samples[0].Roles = null;
17+
samples[1].Roles = new List<Role> { new Role(), new Role() };
18+
19+
var sampleQuery = samples.AsQueryable();
20+
21+
//Act
22+
var expectedResult = sampleQuery.Select(x => new { SecondRole = x.Roles != null ? x.Roles.Skip(1).Take(1) : null }).ToArray();
23+
24+
var result = sampleQuery.Select("new ( iif(Roles != null, Roles.Skip(1).Take(1), null) as SecondRole )");
25+
26+
//Assert
27+
var resultArray = result.ToDynamicArray();
28+
for (int i = 0; i < expectedResult.Count(); i++)
29+
{
30+
var expectedEntry = expectedResult[i];
31+
var entry = resultArray[i];
32+
if (expectedEntry.SecondRole == null)
33+
Assert.Null(entry.SecondRole);
34+
else
35+
Assert.Equal(expectedEntry.SecondRole.ToString(), entry.SecondRole.ToString());
36+
}
37+
}
38+
1139
[Fact]
1240
public void ExpressionTests_StringConcatenation()
1341
{

0 commit comments

Comments
 (0)