Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/System.Linq.Dynamic.Core/DynamicQueryableExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ namespace System.Linq.Dynamic.Core
public static class DynamicQueryableExtensions
{
#if !(WINDOWS_APP45x || SILVERLIGHT)
private static readonly TraceSource TraceSource = new TraceSource(typeof(DynamicQueryableExtensions).Name);
private static readonly TraceSource TraceSource = new TraceSource(nameof(DynamicQueryableExtensions));
#endif

private static Expression OptimizeExpression(Expression expression)
Expand Down Expand Up @@ -76,7 +76,7 @@ public static object Aggregate([NotNull] this IQueryable source, [NotNull] strin
{
ParameterInfo lastParameter = m.GetParameters().LastOrDefault();

return lastParameter != null ? TypeHelper.GetUnderlyingType(lastParameter.ParameterType) == property.PropertyType : false;
return lastParameter != null && TypeHelper.GetUnderlyingType(lastParameter.ParameterType) == property.PropertyType;
});

// Sum, Average
Expand Down
2 changes: 1 addition & 1 deletion src/System.Linq.Dynamic.Core/Parser/ExpressionParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1836,7 +1836,7 @@ Expression ParseEnumerable(Expression instance, Type elementType, string methodN
}
else
{
if (new[] { "Contains", "Take", "Skip", "DefaultIfEmpty" }.Contains(methodName))
if (new[] { "Concat", "Contains", "DefaultIfEmpty", "Except", "Intersect", "Skip", "Take", "Union" }.Contains(methodName))
{
args = new[] { instance, args[0] };
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
namespace System.Linq.Dynamic.Core.Parser.SupportedMethods
using System.Collections;

namespace System.Linq.Dynamic.Core.Parser.SupportedMethods
{
internal interface IEnumerableSignatures
{
Expand All @@ -17,18 +19,21 @@ internal interface IEnumerableSignatures
void Average(long selector);
void Cast(string type);
void Cast(Type type);
void Concat(IEnumerable enumerable);
void Contains(object selector);
void Count();
void Count(bool predicate);
void DefaultIfEmpty();
void DefaultIfEmpty(object defaultValue);
void Distinct();
void Except(IEnumerable enumerable);
void First();
void First(bool predicate);
void FirstOrDefault();
void FirstOrDefault(bool predicate);
void GroupBy(object keySelector);
void GroupBy(object keySelector, object elementSelector);
void Intersect(IEnumerable enumerable);
void Last();
void Last(bool predicate);
void LastOrDefault();
Expand Down Expand Up @@ -63,6 +68,7 @@ internal interface IEnumerableSignatures
void TakeWhile(bool predicate);
void ThenBy(object selector);
void ThenByDescending(object selector);
void Union(IEnumerable enumerable);
void Where(bool predicate);

// Executors
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
namespace System.Linq.Dynamic.Core.Parser.SupportedMethods
using System.Collections;

namespace System.Linq.Dynamic.Core.Parser.SupportedMethods
{
internal interface IQueryableSignatures
{
Expand All @@ -15,19 +17,22 @@ internal interface IQueryableSignatures
void Average(int selector);
void Average(long? selector);
void Average(long selector);
void Concat(IEnumerable enumerable);
void Cast(string type);
void Cast(Type type);
void Count();
void Count(bool predicate);
void DefaultIfEmpty();
void DefaultIfEmpty(object defaultValue);
void Distinct();
void Except(IEnumerable enumerable);
void First();
void First(bool predicate);
void FirstOrDefault();
void FirstOrDefault(bool predicate);
void GroupBy(object keySelector);
void GroupBy(object keySelector, object elementSelector);
void Intersect(IEnumerable enumerable);
void Last();
void Last(bool predicate);
void LastOrDefault();
Expand Down Expand Up @@ -62,6 +67,7 @@ internal interface IQueryableSignatures
void TakeWhile(bool predicate);
void ThenBy(object selector);
void ThenByDescending(object selector);
void Union(IEnumerable enumerable);
void Where(bool predicate);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,6 @@ public void ParseTypeAccess_Via_Constructor_String_To_DateTime_Valid()

[Theory]
[InlineData(null)]
[InlineData(1.1d)]
[InlineData(1.1f)]
[InlineData("\"abc\"")]
public void ParseTypeAccess_Via_Constructor_Any_To_DateTime_Invalid(object any)
{
Expand Down
25 changes: 25 additions & 0 deletions test/System.Linq.Dynamic.Core.Tests/QueryableTests.Concat.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
using System.Collections.Generic;
using FluentAssertions;
using Xunit;

namespace System.Linq.Dynamic.Core.Tests
{
public partial class QueryableTests
{
[Fact]
public void Concat_Dynamic_ListOfStrings()
{
// Arrange
var list1 = new List<bool> { true };
var list2 = new List<string> { "User3", "User4" };
var list3 = new List<string> { "User5", "User6", "User7" };

// Act
var testQuery = list1.AsQueryable().Select("@0.Concat(@1).ToList()", list2, list3);

// Assert
var result = testQuery.ToDynamicArray<List<string>>();
result.First().Should().BeEquivalentTo(list2.Concat(list3));
}
}
}
25 changes: 25 additions & 0 deletions test/System.Linq.Dynamic.Core.Tests/QueryableTests.Except.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
using System.Collections.Generic;
using FluentAssertions;
using Xunit;

namespace System.Linq.Dynamic.Core.Tests
{
public partial class QueryableTests
{
[Fact]
public void Except_Dynamic_ListOfStrings()
{
// Arrange
var list1 = new List<bool> { true };
var list2 = new List<string> { "User3", "User4" };
var list3 = new List<string> { "User3", "User6", "User7" };

// Act
var testQuery = list1.AsQueryable().Select("@0.Except(@1).ToList()", list2, list3);

// Assert
var result = testQuery.ToDynamicArray<List<string>>();
result.First().Should().BeEquivalentTo(list2.Except(list3));
}
}
}
25 changes: 25 additions & 0 deletions test/System.Linq.Dynamic.Core.Tests/QueryableTests.Intersect.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
using System.Collections.Generic;
using FluentAssertions;
using Xunit;

namespace System.Linq.Dynamic.Core.Tests
{
public partial class QueryableTests
{
[Fact]
public void Intersect_Dynamic_ListOfStrings()
{
// Arrange
var list1 = new List<bool> { true };
var list2 = new List<string> { "User3", "User4" };
var list3 = new List<string> { "User3", "User6", "User7" };

// Act
var testQuery = list1.AsQueryable().Select("@0.Intersect(@1).ToList()", list2, list3);

// Assert
var result = testQuery.ToDynamicArray<List<string>>();
result.First().Should().BeEquivalentTo(list2.Intersect(list3));
}
}
}
25 changes: 25 additions & 0 deletions test/System.Linq.Dynamic.Core.Tests/QueryableTests.Union.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
using System.Collections.Generic;
using FluentAssertions;
using Xunit;

namespace System.Linq.Dynamic.Core.Tests
{
public partial class QueryableTests
{
[Fact]
public void Union_Dynamic_ListOfStrings()
{
// Arrange
var list1 = new List<bool> { true };
var list2 = new List<string> { "User3", "User4" };
var list3 = new List<string> { "User3", "User6", "User7" };

// Act
var testQuery = list1.AsQueryable().Select("@0.Union(@1).ToList()", list2, list3);

// Assert
var result = testQuery.ToDynamicArray<List<string>>();
result.First().Should().BeEquivalentTo(list2.Union(list3));
}
}
}
2 changes: 1 addition & 1 deletion version.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<Project>
<PropertyGroup>
<PatchVersion>9</PatchVersion>
<PatchVersion>10-preview-01</PatchVersion>
</PropertyGroup>
</Project>