Короче я знаю в чем проблема, вот в этом ...
Невозможно использовать лямбда-выражение в качестве аргумента для динамически отправляемой операции без предварительного приведения его к типу дерева делегата или выражения
... Я также знаю, что это невозможно по умолчанию.
Мой вопрос (см. Ниже) здесь, как я могу сделать это возможным (даже если мне нужно динамически вызывать компилятор Roslyn, например, для генерации целой новой конкретной сборки)?
Есть ли способ сделать следующий запрос возможным в C #?
Итак, давайте предположим, что у меня есть следующие примеры данных ...
var data = @"
{
""$type"":""System.Dynamic.ExpandoObject, System.Core"",
""Items"":[
{ ""$type"":""System.Dynamic.ExpandoObject, System.Core"", ""Ref"":1, ""BuyerRef"":1, ""SupplierRef"":2, ""FaceValue"":1.34 },
{ ""$type"":""System.Dynamic.ExpandoObject, System.Core"", ""Ref"":1, ""BuyerRef"":1, ""SupplierRef"":2, ""FaceValue"":2.12 },
{ ""$type"":""System.Dynamic.ExpandoObject, System.Core"", ""Ref"":2, ""BuyerRef"":1, ""SupplierRef"":3, ""FaceValue"":100.0 },
{ ""$type"":""System.Dynamic.ExpandoObject, System.Core"", ""Ref"":3, ""BuyerRef"":1, ""SupplierRef"":2, ""FaceValue"":1.0 },
{ ""$type"":""System.Dynamic.ExpandoObject, System.Core"", ""Ref"":4, ""BuyerRef"":3, ""SupplierRef"":2, ""FaceValue"":1.0 },
{ ""$type"":""System.Dynamic.ExpandoObject, System.Core"", ""Ref"":5, ""BuyerRef"":4, ""SupplierRef"":1, ""FaceValue"":1.0 },
{ ""$type"":""System.Dynamic.ExpandoObject, System.Core"", ""Ref"":5, ""BuyerRef"":4, ""SupplierRef"":1, ""FaceValue"":1.0 }
],
""Companies"":[
{ ""CompanyId"":1, ""CompanyName"":""Sample Company 1"" },
{ ""CompanyId"":2, ""CompanyName"":""Sample company 2"" },
{ ""CompanyId"":3, ""CompanyName"":""ACME"" },
{ ""CompanyId"":4, ""CompanyName"":""HSBC Bank UK"" },
{ ""CompanyId"":5, ""CompanyName"":""Basic Buyer UK Ltd"" },
{ ""CompanyId"":6, ""CompanyName"":""Test Global US-CA"" },
{ ""CompanyId"":7, ""CompanyName"":""Test Global US-TX"" },
{ ""CompanyId"":8, ""CompanyName"":""Test Global US-NH"" },
{ ""CompanyId"":9, ""CompanyName"":""Test Global UK"" },
{ ""CompanyId"":10, ""CompanyName"":""Test Global FR"" }
]
}
";
Затем я анализирую с помощью Newtonsofts JsonConvert ...
object source = JsonConvert.DeserializeObject<ExpandoObject>(data);
Теперь я хочу сделать что-то вроде ...
var result = source.Items.Select(item => new
{
Ref = item.Ref,
FaceValue = item.FaceValue,
BuyerId = item.BuyerRef,
Buyer = Companies.Where(company => item.BuyerRef == company.CompanyId).Select(company => company).FirstOrDefault(),
SupplierId = item.SupplierRef,
Supplier = Companies.Where(company => item.SupplierRef == company.Ref).Select(company => company).FirstOrDefault()
})
.ToArray()
.GroupBy(i => new { i.Ref, i.Buyer, i.Supplier })
.Select(group => new
{
Ref = group.Key.Ref,
BuyerId = group.Key.Buyer.Ref,
Buyer = group.Key.Buyer,
SupplierId = group.Key.Supplier.Ref,
Supplier = group.Key.Supplier,
Lines = group.Select(i => new { Ref = i.Ref, FaceValue = i.FaceValue }).ToArray(),
FaceValue = group.Sum(i => i.FaceValue)
})
.ToArray();
... Конечно, проблема в том, что данные полностью динамические и LINQ не будет работать с динамическими объектами.
Допущения, которые можно сделать ...
- данные могут быть любой структурой данных. Приведенный выше пример является иллюстрацией моей проблемы.
- Запрос проверен и проверен и определенно будет работать с данными, указанными, когда я хочу выполнить эту операцию, поэтому я рад избежать проверок на уровне компилятора, если это возможно.
- Предполагается, что мой результат такой же динамичный, и потребляющий код должен делать с этим то, что ему нужно.
Возможно ли это вообще в C #?