System.Linq.Dynamic.Core - error message: “target object is not an ExpandoObject”

526 Views Asked by At

When performing a GroupBy on a collection (of type 'Data' in the following example), a runtime error occurs with with message 'target object is not an ExpandoObject' when I attempt to convert to a list. What does the error mean? And how can I get passed this error?

Here is a sample call that results in the runtime error -

data.AsQueryable().GroupBy(groupingKeySelector,"it").Select(selector).Cast().ToDynamicList()

Code details provided below -

//data object is a list of defined class 'Data'.
public class Data {
        public string Currency { get; set; }
        public int PreTaxCost { get; set; }
}

//variable values: 
var groupingKeySelector = "new (it.Currency as Currency )" 
var selector = "new ( Sum(Convert.ToInt32(it.PreTaxCost)) as PreTaxCost, it.Key.Currency )" 


//Call that throws exception: data.AsQueryable().GroupBy(groupingKeySelector,"it").Select(selector).Cast().ToDynamicList()

//Variation of call that throws same exception data.AsQueryable().GroupBy("new (it.Currency as Currency )", "it").First()

Exception Message

data.AsQueryable().GroupBy(groupingKeySelector,"it").Select(selector).Cast().ToDynamicList()' threw an exception of type 'System.InvalidOperationException' Data: {System.Collections.ListDictionaryInternal} HResult: -2146233079 HelpLink: null InnerException: null Message: "Target object is not an ExpandoObject" Source: "System.Linq.Dynamic.Core" StackTrace: " at System.Linq.Dynamic.Core.Dynamic.DynamicIndex(Object obj, String name) in C:\Users\Jonathan\Documents\GitHub\System.Linq.Dynamic.Core\src\System.Linq.Dynamic.Core\Dynamic\DynamicIndexer.cs:line 30\r\n at lambda_method(Closure , Object )\r\n at System.Linq.Lookup2.Create[TSource](IEnumerable1 source, Func2 keySelector, Func2 elementSelector, IEqualityComparer1 comparer)\r\n at System.Linq.GroupedEnumerable3.GetEnumerator()\r\n at System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext()\r\n at System.Collections.Generic.List1..ctor(IEnumerable1 collection)\r\n at System.Linq.Enumerable.ToList[TSource](IEnumerable1 source)\r\n at System.Linq.Dynamic.Core.DynamicEnumerableExtensions.ToDynamicList(IEnumerable source) in C:\Users\Jonathan\Documents\GitHub\System.Linq.Dynamic.Core\src\System.Linq.Dynamic.Core\DynamicEnumerableExtensions.cs:line 87" TargetSite: {System.Object DynamicIndex(System.Object, System.String)}

1

There are 1 best solutions below

1
On

Are you sure your code gives an error, because when running this code in LinqPad:

public class Data
{
    public string Currency { get; set; }
    public int PreTaxCost { get; set; }
}

void Main()
{
    var groupingKeySelector = "new (it.Currency as Currency )";
    var selector = "new ( Sum(Convert.ToInt32(it.PreTaxCost)) as PreTaxCost, it.Key.Currency )";

    var data = new[]
    {
        new Data { Currency = "$", PreTaxCost = 5 },
        new Data { Currency = "$", PreTaxCost = 10 },
        new Data { Currency = "EURO", PreTaxCost = 20 },
    };

    var result = data.AsQueryable().GroupBy(groupingKeySelector, "it").Select(selector).ToDynamicList();
    result.Dump();
}

The result looks like:

enter image description here