Я упростил следующий пример из своего кода и надеюсь, что из-за этого нет очевидных ошибок компиляции.Допустим, у меня есть следующие объекты (не то, что у меня есть на самом деле, пожалуйста, предположим, у меня нет проблем с EF или схемой, это только для примера):
public class Company
{
public string GroupProperty {get;set;}
public virtual ICollection<PricingForm> PricingForms {get;set;}
}
public class PricingForm
{
public decimal Cost {get;set;}
}
И я хочу сделать запрос вот так:
IQueryable DynamicGrouping<T>(IQueryable<T> query)
{
Expression<Func<Company, decimal?>> exp = c => c.PricingForms.Sum(fr => fr.Cost);
string selector = "new (it.Key as Key, @0(it) as Value)";
IQueryable grouping = query.GroupBy("it.GroupProperty", "it").Select(selector, exp);
return grouping;
}
Я получаю следующую ошибку при вызове строки groupby / select:
System.Linq.Dynamic.ParseException: 'Argument list incompatible with lambda expression'
Какой тип "it" при группировке?Я пытался использовать другие выражения, которые предполагают, что это IGrouping<string, Company>
, или IQueryable<Company>
, та же ошибка.Я попытался просто выбрать «Стоимость» и переместить агрегат Sum () в строку селектора (т. Е. Sum(@0(it)) as Value
) и, похоже, всегда получаю одну и ту же ошибку.
В конце концов я попробовал что-то вроде
Expression<Func<IEnumerable<Company>, decimal?>> exp = l => l.SelectMany(c => c.PricingForms).Sum(fr => fr.Cost);
Однако, этот я получаю дальше, но, пытаясь перебрать результаты, я получил другую ошибку.
The LINQ expression node type 'Invoke' is not supported in LINQ to Entities.
Итак, с этой динамической группировкой и введением моего собственного выборавыражение, что я должен предполагать тип данных «это»?Будет ли это даже работать?