nischalinn Ответов: 2

Сумма LINQ, имеющая условие if


Вот примерные данные для моей проблемы,
List<EMPINSURED> lstEmpIns = new List<EMPINSURED>{
    new EMPINSURED{ EmpID = 558, TOTAL_INSURED_AMT = 50000},
    new EMPINSURED{ EmpID = 559, TOTAL_INSURED_AMT = 75000} 
};


List<EMP_ROUTINE_CHECKUP_HISTORY> lstEmpRoutineChkHist = new List<EMP_ROUTINE_CHECKUP_HISTORY>{
    new EMP_ROUTINE_CHECKUP_HISTORY{ ID = 1, EmpID = 558, ROUTINE_CHECKUP = 1, CHECK_UP_CHARGE = 20000},
    new EMP_ROUTINE_CHECKUP_HISTORY{ ID = 2, EmpID = 559, ROUTINE_CHECKUP = 1, CHECK_UP_CHARGE = 35000},
	new EMP_ROUTINE_CHECKUP_HISTORY{ ID = 3, EmpID = 558, ROUTINE_CHECKUP = 2, CHECK_UP_CHARGE = 10000},
	new EMP_ROUTINE_CHECKUP_HISTORY{ ID = 4, EmpID = 559, ROUTINE_CHECKUP = 2, CHECK_UP_CHARGE = 10000},
	new EMP_ROUTINE_CHECKUP_HISTORY{ ID = 5, EmpID = 558, ROUTINE_CHECKUP = 3, CHECK_UP_CHARGE = 20000}
};


В год работнику разрешается только 3(три) плановых осмотра. Когда работник проходит плановую проверку, его расходы на проверку должны быть вычтены из общей страховой суммы после каждой проверки. При следующем плановом осмотре сотруднику будут начислены расходы на проверку только на оставшуюся у него сумму от общей страховой суммы, любые расходы, превышающие эту сумму, компания нести не будет.
Так что логика расчета оставшейся суммы будет примерно такой ::

int var = 0;
if(ROUTINE_CHECKUP == 1)
{
	REMAINING_AMOUNT = TOTAL_INSURED_AMT - CHECK_UP_CHARGE;
	var = CHECK_UP_CHARGE;
} 
else if (ROUTINE_CHECKUP == 2)
{
	REMAINING_AMOUNT = TOTAL_INSURED_AMT - (CHECK_UP_CHARGE + var);
	var = CHECK_UP_CHARGE + var;
}
else if (ROUTINE_CHECKUP == 3)
{
	REMAINING_AMOUNT = TOTAL_INSURED_AMT - (CHECK_UP_CHARGE + var);
	var = CHECK_UP_CHARGE + var;
}


Как разработать запрос LINQ, чтобы получить приведенные ниже данные отчета, используя эту логику, или может быть какой-то лучший способ сделать это.
Пожалуйста, смотрите ссылку на изображение для формата отчета.
запрос — ImgBB[^]

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

Я понятия не имею, как это сделать. Пожалуйста, помогите мне с этой проблемой.

2 Ответов

Рейтинг:
2

OriginalGriff

Мы более чем готовы помочь тем, кто застрял, но это не значит, что мы здесь, чтобы сделать все это для вас! Мы не можем сделать всю работу, вам либо платят за это, либо это часть ваших оценок, и было бы совсем несправедливо, если бы мы сделали все это за вас.

Поэтому нам нужно, чтобы вы сделали работу, и мы поможем вам, когда вы застряли. Это не значит, что мы дадим вам пошаговое решение, которое вы можете сдать!
Начните с объяснения, где вы находитесь в данный момент и каков следующий шаг в этом процессе. Затем расскажите нам, что вы пытались сделать, чтобы этот следующий шаг сработал, и что произошло, когда вы это сделали.

Начните с конспектов последних лекций и внимательно прочитайте их. Это не так уж трудно, если вы подумаете об этом в течение нескольких минут.


Рейтинг:
2

Maciej Los

Я бы попробовал что-нибудь вроде этого:

var lstps =  (from e in lstEmpIns
    join h in lstEmpRoutineChkHist on e.EmpID equals h.EmpID
    select new
    {
        EmpID = e.EmpID,
        INITIAL_AMT = e.TOTAL_INSURED_AMT,
        ROUTINE_CHECKUP = h.ROUTINE_CHECKUP,
        CHECK_UP_CHARGE = h.CHECK_UP_CHARGE,
        REMAINING_SUM = e.TOTAL_INSURED_AMT - lstEmpRoutineChkHist.Where(x=> x.EmpID == e.EmpID && x.ROUTINE_CHECKUP <= h.ROUTINE_CHECKUP).Sum(x=>x.CHECK_UP_CHARGE)
        //or
        //REMAINING_SUM = e.TOTAL_INSURED_AMT - lstEmpRoutineChkHist.Where(x=> x.EmpID == e.EmpID).TakeWhile(x=>x.ROUTINE_CHECKUP <= h.ROUTINE_CHECKUP).Sum(x=>x.CHECK_UP_CHARGE)
    })
    .ToList();

foreach(var ps in lstps)
{
    Console.WriteLine($"{ps.EmpID}\t{ps.INITIAL_AMT}\t{ps.ROUTINE_CHECKUP}\t{ps.CHECK_UP_CHARGE}\t{ps.REMAINING_SUM}");
}


версия №2 - с помощью предложение Let[^]
var lstps =  (from e in lstEmpIns
    join h in lstEmpRoutineChkHist on e.EmpID equals h.EmpID
    let cuc_sum = lstEmpRoutineChkHist.Where(x=> x.EmpID == e.EmpID && x.ROUTINE_CHECKUP <= h.ROUTINE_CHECKUP).Sum(x=>x.CHECK_UP_CHARGE)
    select new
    {
        EmpID = e.EmpID,
        INITIAL_AMT = e.TOTAL_INSURED_AMT,
        ROUTINE_CHECKUP = h.ROUTINE_CHECKUP,
        CHECK_UP_CHARGE = h.CHECK_UP_CHARGE,
        REMAINING_SUM = e.TOTAL_INSURED_AMT - cuc_sum
    })
    .ToList();


Результат:
558  50000  1  20000  30000
558  50000  2  10000  20000
558  50000  3  20000  0
559  75000  1  35000  40000
559  75000  2  10000  30000


Примечание: есть, вероятно, лучший способ достичь этого...

Удачи вам!


nischalinn

Могу ли я использовать предложение group с этим для group by EmpID, RoutineCheckup?

Maciej Los

Почему? А для чего?