From cbd15b14d850bb9f12c2166f816b213843f1f611 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Wed, 23 Apr 2025 14:52:59 +0200 Subject: [PATCH 1/6] Update DynamicGetMemberBinder to add BindingRestrictions to DynamicMetaObject --- src-console/ConsoleApp_net6.0/Program.cs | 6 +- .../DynamicGetMemberBinder.cs | 6 +- .../DynamicGetMemberBinderTests.cs | 64 +++++++++++++++++++ 3 files changed, 71 insertions(+), 5 deletions(-) create mode 100644 test/System.Linq.Dynamic.Core.Tests/DynamicGetMemberBinderTests.cs diff --git a/src-console/ConsoleApp_net6.0/Program.cs b/src-console/ConsoleApp_net6.0/Program.cs index 3817d897..10a1b4d0 100644 --- a/src-console/ConsoleApp_net6.0/Program.cs +++ b/src-console/ConsoleApp_net6.0/Program.cs @@ -83,14 +83,14 @@ private static void Q912() // GROUPING SET 1: (Region, Product) var detailed = rows .GroupBy("new (Region, Product)") - .Select("new (Key.Region as Region, Key.Product as Product, Sum(Convert.ToInt32(Sales)) as TotalSales, 0 as GroupLevel)"); + .Select("new (Key.Region as Region, Key.Product as Product, Sum(Convert.ToInt32(Sales)) as TotalSales, 0 as GroupLevel)"); // GROUPING SET 2: (Region) var regionSubtotal = rows .GroupBy("Region") - .Select("new (Key as Region, null as Product, Sum(Convert.ToInt32(Sales)) as TotalSales, 1 as GroupLevel)"); + .Select("new (Key as Region, null as Product, Sum(Convert.ToInt32(Sales)) as TotalSales, 1 as GroupLevel)"); - var combined = detailed.Concat(regionSubtotal); + var combined = detailed.ToDynamicArray().Concat(regionSubtotal.ToDynamicArray()).AsQueryable(); var ordered = combined.OrderBy("Product").ToDynamicList(); int x = 9; diff --git a/src/System.Linq.Dynamic.Core/DynamicGetMemberBinder.cs b/src/System.Linq.Dynamic.Core/DynamicGetMemberBinder.cs index f2369f44..8c1727b8 100644 --- a/src/System.Linq.Dynamic.Core/DynamicGetMemberBinder.cs +++ b/src/System.Linq.Dynamic.Core/DynamicGetMemberBinder.cs @@ -21,13 +21,15 @@ public DynamicGetMemberBinder(string name, ParsingConfig? config) : base(name, c public override DynamicMetaObject FallbackGetMember(DynamicMetaObject target, DynamicMetaObject? errorSuggestion) { - var instance = Expression.Call( + var methodCallExpression = Expression.Call( DynamicGetMemberMethod, target.Expression, Expression.Constant(Name), Expression.Constant(IgnoreCase)); - return DynamicMetaObject.Create(target.Value!, instance); + // Fix #907 and #912: "The result of the dynamic binding produced by the object with type '<>f__AnonymousType1`4' for the binder 'System.Linq.Dynamic.Core.DynamicGetMemberBinder' needs at least one restriction.". + var restrictions = BindingRestrictions.GetInstanceRestriction(target.Expression, target.Value); + return new DynamicMetaObject(methodCallExpression, restrictions, target.Value!); } public static object? GetDynamicMember(object value, string name, bool ignoreCase) diff --git a/test/System.Linq.Dynamic.Core.Tests/DynamicGetMemberBinderTests.cs b/test/System.Linq.Dynamic.Core.Tests/DynamicGetMemberBinderTests.cs new file mode 100644 index 00000000..f2483b0a --- /dev/null +++ b/test/System.Linq.Dynamic.Core.Tests/DynamicGetMemberBinderTests.cs @@ -0,0 +1,64 @@ +using FluentAssertions; +using Xunit; + +namespace System.Linq.Dynamic.Core.Tests; + +public class DynamicGetMemberBinderTests +{ + public class SalesData + { + public string Region { get; set; } = null!; + + public string Product { get; set; } = null!; + + public string Sales { get; set; } = null!; + } + + [Fact] + public void DynamicGetMemberBinder_Test1() + { + // Arrange + var rows = new SalesData[] + { + new() { Region = "North", Product = "Widget", Sales = "100" }, + new() { Region = "North", Product = "Gadget", Sales = "150" }, + new() { Region = "South", Product = "Widget", Sales = "200" }, + new() { Region = "South", Product = "Gadget", Sales = "100" }, + new() { Region = "North", Product = "Widget", Sales = "50" } + }.AsQueryable(); + + // Act + var grouping1 = rows + .GroupBy("new (Region, Product)") + .Select("new (Key.Region as Region, Key.Product as Product, Sum(Convert.ToInt32(Sales)) as TotalSales, 0 as GroupLevel)"); + + var grouping2 = rows + .GroupBy("Region") + .Select("new (Key as Region, null as Product, Sum(Convert.ToInt32(Sales)) as TotalSales, 1 as GroupLevel)"); + + var combined = grouping1.ToDynamicArray().Concat(grouping2.ToDynamicArray()).AsQueryable(); + var ordered = combined.OrderBy("Product").ToDynamicList(); + + // Assert + ordered.Should().HaveCount(6); + } + + [Fact] + public void DynamicGetMemberBinder_Test2() + { + // Arrange + var dynamicData = new[] { 1, 2 } + .AsQueryable() + .Select("new { it as Value }") + .ToDynamicArray(); + + // Act + var dynamicResult = dynamicData + .AsQueryable() + .Select("Value") + .ToDynamicArray(); + + // Assert + dynamicResult.Should().HaveCount(2); + } +} \ No newline at end of file From c4be241f99eb6b8b81176531fffed380ac86d22c Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Wed, 23 Apr 2025 15:03:34 +0200 Subject: [PATCH 2/6] update test --- .../DynamicGetMemberBinderTests.cs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/test/System.Linq.Dynamic.Core.Tests/DynamicGetMemberBinderTests.cs b/test/System.Linq.Dynamic.Core.Tests/DynamicGetMemberBinderTests.cs index f2483b0a..95a0cacb 100644 --- a/test/System.Linq.Dynamic.Core.Tests/DynamicGetMemberBinderTests.cs +++ b/test/System.Linq.Dynamic.Core.Tests/DynamicGetMemberBinderTests.cs @@ -49,16 +49,21 @@ public void DynamicGetMemberBinder_Test2() // Arrange var dynamicData = new[] { 1, 2 } .AsQueryable() - .Select("new { it as Value }") - .ToDynamicArray(); + .Select("new { it * 2 as Value }") + .ToDynamicArray() + .AsQueryable(); // Act - var dynamicResult = dynamicData - .AsQueryable() + var dynamicResult1 = dynamicData .Select("Value") .ToDynamicArray(); + var dynamicResult2 = dynamicData + .Select("Value") + .ToDynamicArray(); + // Assert - dynamicResult.Should().HaveCount(2); + dynamicResult1.Should().HaveCount(2); + dynamicResult2.Should().BeEquivalentTo([2, 4]); } } \ No newline at end of file From 43506d824c913053aae1fd6725ae7cf59871d8e0 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Thu, 24 Apr 2025 07:51:56 +0200 Subject: [PATCH 3/6] tests --- src-console/ConsoleAppEF6_InMemory/Program.cs | 17 +++++++++++++- src-console/ConsoleApp_net6.0/Program.cs | 7 +++--- .../EntitiesTests.Select.cs | 22 +++++++++++++++++++ 3 files changed, 41 insertions(+), 5 deletions(-) diff --git a/src-console/ConsoleAppEF6_InMemory/Program.cs b/src-console/ConsoleAppEF6_InMemory/Program.cs index f9bed31a..31a9850b 100644 --- a/src-console/ConsoleAppEF6_InMemory/Program.cs +++ b/src-console/ConsoleAppEF6_InMemory/Program.cs @@ -26,7 +26,7 @@ static async Task Main(string[] args) await using (var context = new TestContextEF6()) { var result784 = context.Products.Where("NullableInt = @0", 1).ToDynamicArray(); - Console.WriteLine("a1 {0}", string.Join(",", result784.Select(r => r.Key))); + Console.WriteLine("a1 {0}", string.Join(", ", result784.Select(r => r.Key))); } await using (var context = new TestContextEF6()) @@ -65,5 +65,20 @@ static async Task Main(string[] args) Console.WriteLine(result.Key + ":" + JsonSerializer.Serialize(result.Dict, JsonSerializerOptions)); } } + + // #907 and #912 + await using (var context = new TestContextEF6()) + { + var dynamicData = context.Products + .AsQueryable() + .Select("new { NullableInt as Value }") + .ToDynamicArray(); + var dynamicResult = dynamicData + .AsQueryable() + .Select("Value") + .ToDynamicArray(); + + Console.WriteLine("#907 and #912 = {0}", string.Join(", ", dynamicResult)); + } } } \ No newline at end of file diff --git a/src-console/ConsoleApp_net6.0/Program.cs b/src-console/ConsoleApp_net6.0/Program.cs index 10a1b4d0..4aab0ffb 100644 --- a/src-console/ConsoleApp_net6.0/Program.cs +++ b/src-console/ConsoleApp_net6.0/Program.cs @@ -33,7 +33,6 @@ public class GroupedSalesData public string Region { get; set; } public string? Product { get; set; } public int TotalSales { get; set; } - public int GroupLevel { get; set; } } @@ -83,14 +82,14 @@ private static void Q912() // GROUPING SET 1: (Region, Product) var detailed = rows .GroupBy("new (Region, Product)") - .Select("new (Key.Region as Region, Key.Product as Product, Sum(Convert.ToInt32(Sales)) as TotalSales, 0 as GroupLevel)"); + .Select("new (Key.Region as Region, Key.Product as Product, Sum(Convert.ToInt32(Sales)) as TotalSales, 0 as GroupLevel)"); // GROUPING SET 2: (Region) var regionSubtotal = rows .GroupBy("Region") - .Select("new (Key as Region, null as Product, Sum(Convert.ToInt32(Sales)) as TotalSales, 1 as GroupLevel)"); + .Select("new (Key as Region, null as Product, Sum(Convert.ToInt32(Sales)) as TotalSales, 1 as GroupLevel)"); - var combined = detailed.ToDynamicArray().Concat(regionSubtotal.ToDynamicArray()).AsQueryable(); + var combined = detailed.Concat(regionSubtotal).AsQueryable(); var ordered = combined.OrderBy("Product").ToDynamicList(); int x = 9; diff --git a/test/System.Linq.Dynamic.Core.Tests/EntitiesTests.Select.cs b/test/System.Linq.Dynamic.Core.Tests/EntitiesTests.Select.cs index ab0b44c9..6626d842 100644 --- a/test/System.Linq.Dynamic.Core.Tests/EntitiesTests.Select.cs +++ b/test/System.Linq.Dynamic.Core.Tests/EntitiesTests.Select.cs @@ -1,5 +1,6 @@ using System.Collections; using System.Linq.Dynamic.Core.Exceptions; +using FluentAssertions; using Newtonsoft.Json; #if EFCORE using Microsoft.EntityFrameworkCore; @@ -142,4 +143,25 @@ public void Entities_Select_DynamicClass_And_Call_Any() // Assert Assert.True(result); } + + /// + /// #907 + /// + [Fact] + public void Entities_Select_DynamicClass_And_Select_DynamicClass() + { + // Act + var dynamicData = _context.Blogs + .Take(2) + .Select("new (BlogId as I, Name as N)") + .ToDynamicArray(); + + // Assert + var dynamicResult = dynamicData + .AsQueryable() + .Select("I") + .ToDynamicArray(); + + dynamicResult.Should().BeEquivalentTo([1000, 1001]); + } } \ No newline at end of file From 649ca3fbfa33a694c803ccd733ec7947a1bbf712 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Thu, 24 Apr 2025 10:26:33 +0200 Subject: [PATCH 4/6] fix expression parser for DataTable --- src-console/ConsoleApp_net6.0/Program.cs | 39 ++++++- .../Parser/ExpressionParser.cs | 12 +- .../DynamicGetMemberBinderTests.cs | 108 +++++++++++++++++- 3 files changed, 146 insertions(+), 13 deletions(-) diff --git a/src-console/ConsoleApp_net6.0/Program.cs b/src-console/ConsoleApp_net6.0/Program.cs index 4aab0ffb..e17dbe93 100644 --- a/src-console/ConsoleApp_net6.0/Program.cs +++ b/src-console/ConsoleApp_net6.0/Program.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Data; using System.Linq; using System.Linq.Dynamic.Core; using System.Linq.Dynamic.Core.NewtonsoftJson; @@ -40,7 +41,8 @@ class Program { static void Main(string[] args) { - Q912(); + Q912a(); + Q912b(); return; Json(); @@ -66,7 +68,7 @@ static void Main(string[] args) Dynamic(); } - private static void Q912() + private static void Q912a() { var extractedRows = new List { @@ -95,6 +97,39 @@ private static void Q912() int x = 9; } + private static void Q912b() + { + var eInfoJoinTable = new DataTable(); + eInfoJoinTable.Columns.Add("Region", typeof(string)); + eInfoJoinTable.Columns.Add("Product", typeof(string)); + eInfoJoinTable.Columns.Add("Sales", typeof(int)); + + eInfoJoinTable.Rows.Add("North", "Apples", 100); + eInfoJoinTable.Rows.Add("North", "Oranges", 150); + eInfoJoinTable.Rows.Add("South", "Apples", 200); + eInfoJoinTable.Rows.Add("South", "Oranges", 250); + + var extractedRows = + from row in eInfoJoinTable.AsEnumerable() + select row; + + var rows = extractedRows.AsQueryable(); + + // GROUPING SET 1: (Region, Product) + var detailed = rows + .GroupBy("new (Region, Product)") + .Select("new (Key.Region as Region, Key.Product as Product, Sum(Convert.ToInt32(Sales)) as TotalSales, 0 as GroupLevel)"); + + // GROUPING SET 2: (Region) + var regionSubtotal = rows + .GroupBy("Region") + .Select("new (Key as Region, null as Product, Sum(Convert.ToInt32(Sales)) as TotalSales, 1 as GroupLevel)"); + + var combined = detailed.ToDynamicArray().Concat(regionSubtotal.ToDynamicArray()).AsQueryable(); + var ordered = combined.OrderBy("Product").ToDynamicList(); + + int x = 9; + } private static void NewtonsoftJson() { diff --git a/src/System.Linq.Dynamic.Core/Parser/ExpressionParser.cs b/src/System.Linq.Dynamic.Core/Parser/ExpressionParser.cs index 1ec0fea6..c2fb0102 100644 --- a/src/System.Linq.Dynamic.Core/Parser/ExpressionParser.cs +++ b/src/System.Linq.Dynamic.Core/Parser/ExpressionParser.cs @@ -1609,9 +1609,9 @@ private Expression CreateNewExpression(List properties, List properties, List("new (Key.Region as Region, Key.Product as Product, Sum(Convert.ToInt32(Sales)) as TotalSales, 0 as GroupLevel)"); + + var grouping2 = rows + .GroupBy("Region") + .Select("new (Key as Region, null as Product, Sum(Convert.ToInt32(Sales)) as TotalSales, 1 as GroupLevel)"); + + var combined = grouping1.Concat(grouping2).AsQueryable(); + var ordered = combined.OrderBy("Product").ToDynamicList(); + + // Assert + ordered.Should().HaveCount(6); + } + + [Fact] + public void DynamicGetMemberBinder_SelectOnDataTable() + { + // Arrange + var dataTable = new DataTable(); + dataTable.Columns.Add("Region", typeof(string)); + dataTable.Columns.Add("Product", typeof(string)); + dataTable.Columns.Add("Sales", typeof(int)); + + dataTable.Rows.Add("North", "Apples", 100); + dataTable.Rows.Add("North", "Oranges", 150); + dataTable.Rows.Add("South", "Apples", 200); + dataTable.Rows.Add("South", "Oranges", 250); + + var rows = dataTable.Rows.Cast().AsQueryable(); + + // Act + var grouping1 = rows + .GroupBy("new (Region, Product)") + .Select("new (Key.Region as Region, Key.Product as Product, Sum(Convert.ToInt32(Sales)) as TotalSales, 0 as GroupLevel)"); + + var grouping2 = rows + .GroupBy("Region") + .Select("new (Key as Region, null as Product, Sum(Convert.ToInt32(Sales)) as TotalSales, 1 as GroupLevel)"); + + var combined = grouping1.ToDynamicArray().Concat(grouping2.ToDynamicArray()).AsQueryable(); + var ordered = combined.OrderBy("Product").ToDynamicList(); + + // Assert + ordered.Should().HaveCount(6); + } + + [Fact] + public void DynamicGetMemberBinder_SelectTypeOnDataTable() + { + // Arrange + var dataTable = new DataTable(); + dataTable.Columns.Add("Region", typeof(string)); + dataTable.Columns.Add("Product", typeof(string)); + dataTable.Columns.Add("Sales", typeof(int)); + + dataTable.Rows.Add("North", "Apples", 100); + dataTable.Rows.Add("North", "Oranges", 150); + dataTable.Rows.Add("South", "Apples", 200); + dataTable.Rows.Add("South", "Oranges", 250); + + var rows = dataTable.Rows.Cast().AsQueryable(); + + // Act + var grouping1 = rows + .GroupBy("new (Region, Product)") + .Select("new (Key.Region as Region, Key.Product as Product, Sum(Convert.ToInt32(Sales)) as TotalSales, 0 as GroupLevel)"); + + var grouping2 = rows + .GroupBy("Region") + .Select("new (Key as Region, null as Product, Sum(Convert.ToInt32(Sales)) as TotalSales, 1 as GroupLevel)"); + + var combined = grouping1.ToDynamicArray().Concat(grouping2.ToDynamicArray()).AsQueryable(); + var ordered = combined.OrderBy("Product").ToDynamicList(); + + // Assert + ordered.Should().HaveCount(6); + } + + [Fact] + public void DynamicGetMemberBinder_SelectOnArrayWithIntegers() { // Arrange var dynamicData = new[] { 1, 2 } From 9abc9c772c58b97d030e65d6f046423eab6080f3 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Thu, 24 Apr 2025 11:00:42 +0200 Subject: [PATCH 5/6] fix tests? --- .../DynamicGetMemberBinderTests.cs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/test/System.Linq.Dynamic.Core.Tests/DynamicGetMemberBinderTests.cs b/test/System.Linq.Dynamic.Core.Tests/DynamicGetMemberBinderTests.cs index 84b065f3..207af229 100644 --- a/test/System.Linq.Dynamic.Core.Tests/DynamicGetMemberBinderTests.cs +++ b/test/System.Linq.Dynamic.Core.Tests/DynamicGetMemberBinderTests.cs @@ -1,4 +1,5 @@ -using System.Data; +#if !NET461 +using System.Data; using FluentAssertions; using Xunit; @@ -95,7 +96,10 @@ public void DynamicGetMemberBinder_SelectOnDataTable() dataTable.Rows.Add("South", "Apples", 200); dataTable.Rows.Add("South", "Oranges", 250); - var rows = dataTable.Rows.Cast().AsQueryable(); + var extractedRows = + from row in dataTable.AsEnumerable() + select row; + var rows = extractedRows.AsQueryable(); // Act var grouping1 = rows @@ -127,7 +131,10 @@ public void DynamicGetMemberBinder_SelectTypeOnDataTable() dataTable.Rows.Add("South", "Apples", 200); dataTable.Rows.Add("South", "Oranges", 250); - var rows = dataTable.Rows.Cast().AsQueryable(); + var extractedRows = + from row in dataTable.AsEnumerable() + select row; + var rows = extractedRows.AsQueryable(); // Act var grouping1 = rows @@ -168,4 +175,5 @@ public void DynamicGetMemberBinder_SelectOnArrayWithIntegers() dynamicResult1.Should().HaveCount(2); dynamicResult2.Should().BeEquivalentTo([2, 4]); } -} \ No newline at end of file +} +#endif \ No newline at end of file From 4a92725cc01877c94b1ccb96b8612f3c23de024f Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Thu, 24 Apr 2025 11:11:54 +0200 Subject: [PATCH 6/6] SkipIfGitHubActionsFactAttribute --- .../EntityFramework.DynamicLinq.Tests.csproj | 4 ++++ .../DynamicClassTest.cs | 8 +++---- .../DynamicGetMemberBinderTests.cs | 21 +++++++------------ ...cs => SkipIfGitHubActionsFactAttribute.cs} | 4 ++-- 4 files changed, 17 insertions(+), 20 deletions(-) rename test/System.Linq.Dynamic.Core.Tests/TestHelpers/{SkipIfGitHubActionsAttribute.cs => SkipIfGitHubActionsFactAttribute.cs} (94%) diff --git a/test/EntityFramework.DynamicLinq.Tests/EntityFramework.DynamicLinq.Tests.csproj b/test/EntityFramework.DynamicLinq.Tests/EntityFramework.DynamicLinq.Tests.csproj index da9a469b..bb2d9ae6 100644 --- a/test/EntityFramework.DynamicLinq.Tests/EntityFramework.DynamicLinq.Tests.csproj +++ b/test/EntityFramework.DynamicLinq.Tests/EntityFramework.DynamicLinq.Tests.csproj @@ -29,6 +29,10 @@ + + + + diff --git a/test/System.Linq.Dynamic.Core.Tests/DynamicClassTest.cs b/test/System.Linq.Dynamic.Core.Tests/DynamicClassTest.cs index 100603aa..32dd3002 100644 --- a/test/System.Linq.Dynamic.Core.Tests/DynamicClassTest.cs +++ b/test/System.Linq.Dynamic.Core.Tests/DynamicClassTest.cs @@ -217,7 +217,7 @@ public void DynamicClass_GetRuntimeType() typeOf.ToString().Should().Be("System.Linq.Dynamic.Core.DynamicClass"); } - [SkipIfGitHubActions] + [SkipIfGitHubActionsFact] public void DynamicClassArray() { // Arrange @@ -249,7 +249,7 @@ public void DynamicClassArray() isValid.Should().BeTrue(); } - [SkipIfGitHubActions] + [SkipIfGitHubActionsFact] public void DynamicClassArray_Issue593_Fails() { // Arrange @@ -281,7 +281,7 @@ public void DynamicClassArray_Issue593_Fails() isValid.Should().BeFalse(); // This should actually be true, but fails. For solution see Issue593_Solution1 and Issue593_Solution2. } - [SkipIfGitHubActions] + [SkipIfGitHubActionsFact] public void DynamicClassArray_Issue593_Solution1() { // Arrange @@ -318,7 +318,7 @@ public void DynamicClassArray_Issue593_Solution1() isValid.Should().BeTrue(); } - [SkipIfGitHubActions] + [SkipIfGitHubActionsFact] public void DynamicClassArray_Issue593_Solution2() { // Arrange diff --git a/test/System.Linq.Dynamic.Core.Tests/DynamicGetMemberBinderTests.cs b/test/System.Linq.Dynamic.Core.Tests/DynamicGetMemberBinderTests.cs index 207af229..697a053a 100644 --- a/test/System.Linq.Dynamic.Core.Tests/DynamicGetMemberBinderTests.cs +++ b/test/System.Linq.Dynamic.Core.Tests/DynamicGetMemberBinderTests.cs @@ -1,5 +1,5 @@ -#if !NET461 -using System.Data; +using System.Data; +using System.Linq.Dynamic.Core.Tests.TestHelpers; using FluentAssertions; using Xunit; @@ -82,7 +82,7 @@ public void DynamicGetMemberBinder_SelectTypeOnArrayWithComplexObjects() ordered.Should().HaveCount(6); } - [Fact] + [SkipIfGitHubActionsFact] public void DynamicGetMemberBinder_SelectOnDataTable() { // Arrange @@ -96,10 +96,7 @@ public void DynamicGetMemberBinder_SelectOnDataTable() dataTable.Rows.Add("South", "Apples", 200); dataTable.Rows.Add("South", "Oranges", 250); - var extractedRows = - from row in dataTable.AsEnumerable() - select row; - var rows = extractedRows.AsQueryable(); + var rows = dataTable.Rows.Cast().AsQueryable(); // Act var grouping1 = rows @@ -117,7 +114,7 @@ from row in dataTable.AsEnumerable() ordered.Should().HaveCount(6); } - [Fact] + [SkipIfGitHubActionsFact] public void DynamicGetMemberBinder_SelectTypeOnDataTable() { // Arrange @@ -131,10 +128,7 @@ public void DynamicGetMemberBinder_SelectTypeOnDataTable() dataTable.Rows.Add("South", "Apples", 200); dataTable.Rows.Add("South", "Oranges", 250); - var extractedRows = - from row in dataTable.AsEnumerable() - select row; - var rows = extractedRows.AsQueryable(); + var rows = dataTable.Rows.Cast().AsQueryable(); // Act var grouping1 = rows @@ -175,5 +169,4 @@ public void DynamicGetMemberBinder_SelectOnArrayWithIntegers() dynamicResult1.Should().HaveCount(2); dynamicResult2.Should().BeEquivalentTo([2, 4]); } -} -#endif \ No newline at end of file +} \ No newline at end of file diff --git a/test/System.Linq.Dynamic.Core.Tests/TestHelpers/SkipIfGitHubActionsAttribute.cs b/test/System.Linq.Dynamic.Core.Tests/TestHelpers/SkipIfGitHubActionsFactAttribute.cs similarity index 94% rename from test/System.Linq.Dynamic.Core.Tests/TestHelpers/SkipIfGitHubActionsAttribute.cs rename to test/System.Linq.Dynamic.Core.Tests/TestHelpers/SkipIfGitHubActionsFactAttribute.cs index be6ff839..4ef92c26 100644 --- a/test/System.Linq.Dynamic.Core.Tests/TestHelpers/SkipIfGitHubActionsAttribute.cs +++ b/test/System.Linq.Dynamic.Core.Tests/TestHelpers/SkipIfGitHubActionsFactAttribute.cs @@ -2,9 +2,9 @@ namespace System.Linq.Dynamic.Core.Tests.TestHelpers; -internal class SkipIfGitHubActionsAttribute : FactAttribute +internal class SkipIfGitHubActionsFactAttribute : FactAttribute { - public SkipIfGitHubActionsAttribute() + public SkipIfGitHubActionsFactAttribute() { if (IsRunningOnGitHubActions()) {