Рассмотрим следующий класс:Создание пользовательского агрегатной функции в C# с помощью LINQ
public class TaxType
{
public int Id {get;set;}
public decimal TotalTaxCollected {get;set;}
public string DetailXml {get;set;}
}
Я получил следующий LINQ запрос где-то в коде:
GetTaxTypesFromTheDataSource()
.Where(/*blah blah blah*/)
.GroupBy(t => new { t.Id })
.Select(g => new TaxType
{
TotalTaxCollected = g.Sum(n => n.TotalTaxCollected),
DetailXml = g.Aggregate(SumOfInnerElementsOfXml).DetailXml
})
.ToList();
Где объявлен SumOfInnerElementsOfXml следующим образом:
private TaxType SumOfInnerElementsOfXml(TaxType t1, TaxType t2)
{
//(a) Deserialize the t1.DetailXml & t2.DetailXml into 2 different arrays.
//(b) Aggregate both arrays based on their IDs.
//(c) Serialize the result into an xml string.
//(d) Instantiate a new TaxType and set its DetailXml to the generated xml string.
//return (d)
}
Вышеупомянутое решение работает отлично, однако я хотел бы создать свою собственную совокупную функциональность n, так что я могу использовать его следующим образом:
GetTaxTypesFromTheDataSource()
.Where(/*blah blah blah*/)
.GroupBy(t => new { t.Id })
.Select(g => new TaxType
{
TotalTaxCollected = g.Sum(n => n.TotalTaxCollected),
DetailXml = g.MyCustomAggregateFunction(n => n.DetailXml)
})
.ToList();
Как это возможно? Я пробовал несколько методов расширения, но, к сожалению, никто из них не работал.
Similiar: http://stackoverflow.com/questions/20372119/creating-a-custom-aggregate-function-in-c-sharp-using-linq –