jinesh sam Ответов: 1

Список групп и сумм объектов


Привет Друзья,

У меня есть XML, и мне нужна группа и сумма YearlyAmts->netAmount на основе Account -> Type. Я де - сериализации XML и сделать его как объект. теперь мне нужно применить запрос к объекту. Я могу группировать и суммировать годовую сумму, но мое требование заключается в том, что при группировке необходимо также учитывать тип счета.

Ожидаемый Результат

Тип Год NetAmount
401k 2016 5000
VA 2016 40000

Ниже приведен пример xml
<YearlyContributions>
<Item1>
<contribution>
	<ContributionId>4</ContributionId>
	<CType>profitsharing</CType>
	<CSubType>Amount</CSubType>
	<TaxTreatment>PreTax</TaxTreatment>
	<Account>
		<AccountID>5</AccountID>
		<Type>401K</Type>
		<LimitGrp>401K</LimitGrp>
		<AcClient>
			<birthyear>1971</birthyear>
			<ClientID>2</ClientID>
			<endOfAnalysisYear>2066</endOfAnalysisYear>
			<Isprimary>N</Isprimary>
			<retirementYear>2040</retirementYear>
		</AcClient>
		<MarketValue>30000</MarketValue>
		<VAAccountType/>
	</Account>
	<income>
		<IncomeID>2</IncomeID>
		<Type>SB</Type>
		<Client>
			<birthyear>1971</birthyear>
			<ClientID>2</ClientID>
			<endOfAnalysisYear>2066</endOfAnalysisYear>
			<Isprimary>N</Isprimary>
			<retirementYear>2040</retirementYear>
		</Client>
		<OwnershipType>Single</OwnershipType>
		<TaxExempt>N</TaxExempt>
		<CertainGauranteePeriod>0</CertainGauranteePeriod>
		<SurvivorshipPercent>0</SurvivorshipPercent>
		<exclusionratio>0</exclusionratio>
		<ExclusionRatioExpectedDeathAge>0</ExclusionRatioExpectedDeathAge>
		<AmountPeriodID>4</AmountPeriodID>
	</income>
	<AmountPeriodID>0</AmountPeriodID>
</contribution>
<stateofmortality/>
<YearlyAmts>
	<Item1>
		<year>2016</year>
		<netAmount>50000</netAmount>
	</Item1>
	<Item2>
		<year>2017</year>
		<netAmount>51000</netAmount>
	</Item2>
	<Item3>
		<year>2018</year>
		<netAmount>52020</netAmount>
	</Item3>
</YearlyAmts>
</Item1>
<Item2>
<contribution>
	<ContributionId>5</ContributionId>
	<CType>profitsharing</CType>
	<CSubType>Percent</CSubType>
	<TaxTreatment>PreTax</TaxTreatment>
	<Account>
		<AccountID>9</AccountID>
		<Type>VA</Type>
		<LimitGrp>401K</LimitGrp>
		<AcClient>
			<birthyear>1970</birthyear>
			<ClientID>1</ClientID>
			<endOfAnalysisYear>2065</endOfAnalysisYear>
			<Isprimary>Y</Isprimary>
			<retirementYear>2039</retirementYear>
		</AcClient>
		<MarketValue>30000</MarketValue>
		<VAAccountType>401K</VAAccountType>
	</Account>
	<income>
		<IncomeID>1</IncomeID>
		<Type>SB</Type>
		<Client>
			<birthyear>1970</birthyear>
			<ClientID>1</ClientID>
			<endOfAnalysisYear>2065</endOfAnalysisYear>
			<Isprimary>Y</Isprimary>
			<retirementYear>2039</retirementYear>
		</Client>
		<OwnershipType>Single</OwnershipType>
		<TaxExempt>N</TaxExempt>
		<CertainGauranteePeriod>0</CertainGauranteePeriod>
		<SurvivorshipPercent>0</SurvivorshipPercent>
		<exclusionratio>0</exclusionratio>
		<ExclusionRatioExpectedDeathAge>0</ExclusionRatioExpectedDeathAge>
		<AmountPeriodID>3</AmountPeriodID>
	</income>
	<AmountPeriodID>0</AmountPeriodID>
</contribution>
<stateofmortality/>
<YearlyAmts>
	<Item25>
		<year>2016</year>
		<netAmount>40000</netAmount>
	</Item25>
	<Item26>
		<year>2017</year>
		<netAmount>40800</netAmount>
	</Item26>
	<Item27>
		<year>2018</year>
		<netAmount>41616</netAmount>
	</Item27>
</YearlyAmts>
</Item2>
</YearlyContributions>


Недавно добавлено: структура класса
public class YearlyContributions
{
    public List<ContributionItem> Item { get; set; }
}
public class ContributionItem
{
    public Contribution Contribution { get; set; }
    public string stateofmortality { get; set; }
    public YearlyAmt YearlyAmts { get; set; }
}
public class Contribution
{
    public int ContributionId { get; set; }
    public string CType { get; set; }
    public string CSubType { get; set; }
    public string TaxTreatment { get; set; }
    public Account Account { get; set; }
    public Income Income { get; set; }
    public int AmountPeriodID { get; set; }
}
public class Account
{
    public int AccountID { get; set; }
    public string Type { get; set; }
    public string LimitGrp { get; set; }
    public Client AcClient { get; set; }
    public double MarketValue { get; set; }
    public string VAAccountType { get; set; }
}
public class Client
{
    public int birthyear { get; set; }
    public int ClientID { get; set; }
    public int endOfAnalysisYear { get; set; }
    public string Isprimary { get; set; }
    public int retirementYear { get; set; }
}
public class Income
{
    public int IncomeID { get; set; }
    public string Type { get; set; }
    public Client Client { get; set; }
    public string OwnershipType { get; set; }
    public string TaxExempt { get; set; }
    public double CertainGauranteePeriod { get; set; }
    public double SurvivorshipPercent { get; set; }
    public double exclusionratio { get; set; }
    public double ExclusionRatioExpectedDeathAge { get; set; }
    public int AmountPeriodID { get; set; }
}
public class YearlyAmt
{
    public List<YearlyItem> YearlyAmts { get; set; }
}
public class YearlyItem
{
    public int year { get; set; }
    public double NetAmount { get; set; }
}


Что я уже пробовал:

var lstcon = ycon.Item
        .SelectMany(s => s.YearlyAmts.YearlyAmts)
        .GroupBy(yr => yr.year)
        .Select(g => new
        {
            Key = g.Key,
            Value = g.Sum(s => s.NetAmount),
        })
        .ToList();

Maciej Los

Мне действительно интересно, как вы десериализовали такую структуру данных... Нет одинаковых объектов: Item1, Item2 и т. д.

jinesh sam

используя выражение XPath "начинается с"

1 Ответов

Рейтинг:
9

Maciej Los

Пожалуйста, сначала прочтите мой комментарий к этому вопросу.

Предвидеть:

var result = items.SelectMany(i=>
        i.YearlyAmt.YearlyAmts.Select(ya => new
            {
                ContributionId = i.Contribution.ContributionId,
                AccountId = i.Contribution.Account.AccountID,
                Type = i.Contribution.Account.Type,
                Year = ya.year,
                NetAmount = ya.NetAmount
            }))
    .GroupBy(x=>new{Year = x.Year, Type = x.Type})
    .Select(grp=>new
        {
            Type = grp.Key.Type,
            Year = grp.Key.Year,
            NetAmount = grp.Sum(a=>a.NetAmount)
        });


В вашем случае приведенный выше код должен вернуться:

Type  Year  NetAmount
401K  2016  50000 
401K  2017  51000 
401K  2018  52020 
VA    2016  40000 
VA    2017  40800 
VA    2018  41616


jinesh sam

Поскольку YearlyAmts - это список, я не могу напрямую использовать свойство year и NetAmount. Я обновил вопрос с помощью классовой структуры. пожалуйста, взгляните

Maciej Los

Извините, ваше определение класса неполное...

jinesh sam

Обновлено определение класса. Пожалуйста, взгляните

Maciej Los

Сделано. Проверьте обновленный ответ (раздел "второе предположение").

jinesh sam

Спасибо Мацей :)

BillWoodruff

+5

Maciej Los

Всегда пожалуйста.

Maciej Los

- Спасибо, Билл.