Skip to content

Commit e9b1711

Browse files
committed
Distinct (#21)
1 parent 7aae54f commit e9b1711

11 files changed

+646
-412
lines changed

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

+24
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,30 @@ namespace System.Linq.Dynamic.Core
1616
/// </summary>
1717
public static class DynamicQueryable
1818
{
19+
/// <summary>
20+
/// Determines whether a sequence contains any elements.
21+
/// </summary>
22+
/// <param name="source">A sequence to check for being empty.</param>
23+
/// <param name="predicate">A function to test each element for a condition.</param>
24+
/// <param name="args">An object array that contains zero or more objects to insert into the predicate as parameters. Similar to the way String.Format formats strings.</param>
25+
/// <returns>true if the source sequence contains any elements; otherwise, false.</returns>
26+
public static bool Any([NotNull] this IQueryable source, [NotNull] string predicate, params object[] args)
27+
{
28+
Check.NotNull(source, nameof(source));
29+
Check.NotEmpty(predicate, nameof(predicate));
30+
31+
bool createParameterCtor = source.IsLinqToObjects();
32+
LambdaExpression lambda = DynamicExpression.ParseLambda(createParameterCtor, source.ElementType, null, predicate, args);
33+
34+
return (bool)source.Provider.Execute(
35+
Expression.Call(
36+
typeof(Queryable), "Any",
37+
new[] { source.ElementType },
38+
source.Expression,
39+
Expression.Quote(lambda))
40+
);
41+
}
42+
1943
#region Where
2044

2145
/// <summary>

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

+1
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ interface IEnumerableSignatures
188188
void Contains(object selector);
189189
void Skip(int count);
190190
void Take(int count);
191+
void Distinct();
191192

192193
//Executors
193194
void Single();

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

-20
Original file line numberDiff line numberDiff line change
@@ -6,26 +6,6 @@ namespace System.Linq.Dynamic.Core.Tests
66
{
77
public class BasicTests
88
{
9-
10-
[Fact]
11-
public void Any()
12-
{
13-
//Arrange
14-
IQueryable testListFull = User.GenerateSampleModels(100).AsQueryable();
15-
IQueryable testListOne = User.GenerateSampleModels(1).AsQueryable();
16-
IQueryable testListNone = User.GenerateSampleModels(0).AsQueryable();
17-
18-
//Act
19-
var resultFull = testListFull.Any();
20-
var resultOne = testListOne.Any();
21-
var resultNone = testListNone.Any();
22-
23-
//Assert
24-
Assert.True(resultFull);
25-
Assert.True(resultOne);
26-
Assert.False(resultNone);
27-
}
28-
299
[Fact]
3010
public void Count()
3111
{

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

+1-33
Original file line numberDiff line numberDiff line change
@@ -124,39 +124,7 @@ public void Contains()
124124
Assert.Equal(realQuery.ToArray(), testQuery.Cast<Guid>().ToArray());
125125
}
126126

127-
[Fact]
128-
public void Any()
129-
{
130-
const string search = "e";
131-
132-
// Arrange
133-
var testList = User.GenerateSampleModels(10);
134-
var queryable = testList.AsQueryable();
135-
136-
// Act
137-
var expected = queryable.Where(u => u.Roles.Any(r => r.Name.Contains(search))).ToArray();
138-
var result = queryable.Where("Roles.Any(Name.Contains(@0))", search).ToArray();
139-
140-
Assert.Equal(expected, result);
141-
}
142-
143-
// https://dynamiclinq.codeplex.com/discussions/654313
144-
[Fact]
145-
public void Any_Nested()
146-
{
147-
const string search = "a";
148-
149-
// Arrange
150-
var testList = User.GenerateSampleModels(10);
151-
var queryable = testList.AsQueryable();
152-
153-
// Act
154-
var expected =
155-
queryable.Where(u => u.Roles.Any(r => r.Permissions.Any(p => p.Name.Contains(search)))).ToArray();
156-
var result = queryable.Where("Roles.Any(Permissions.Any(Name.Contains(@0)))", search).ToArray();
157-
158-
Assert.Equal(expected, result);
159-
}
127+
160128

161129
[Fact]
162130
// https://github.com/StefH/System.Linq.Dynamic.Core/issues/19

0 commit comments

Comments
 (0)