2015-05-30 3 views
0

Как я могу реорганизовать этот код?Как Refactor LINQ

Возможно ли сделать aktuelKurs og kursFagenFor в той же строке?

EDIT 2

if (aktiekurser != null) 
    { 
    int idDato = aktiekurser.Last().IdDato; 

    for (int i = 0; i < antalDage; i++) 
    { 
     aktuelKurs = (from a in aktiekurser 
        where a.IdDato == idDato - i 
        select a.Lukkekurs 
        ).Sum(); 

     kursDagenFor = (from a in aktiekurser 
        where a.IdDato == idDato - (i + 1) 
        select a.Lukkekurs 
        ).Sum(); 

     gnsOp += aktuelKurs > kursDagenFor ? aktuelKurs :0m; 
    } 
    } 
+2

Как будет 'where a.IdDato == a.IdDato - i' когда-либо найти элемент для значений i, которые не являются 0? – nvoigt

+0

nvoigt прав, этот код не имеет смысла. Что именно вы пытаетесь достичь здесь? – Corey

+0

nvoigt, спасибо, я изменил код. Я найду «a.Lukkekurs», где «a.IdDato» равно («самый высокий a.IdDato» - i). – MHP

ответ

1

Это не очень эффективно. Во-первых, вы запрашиваете каждую отдельную сумму отдельно, и, во-вторых, на каждой итерации вы вычисляете сумму, которая также была рассчитана на предыдущей итерации.

Вы можете сделать это гораздо более эффективным, запрашивая аль требуется суммы в один группирования запроса:

var aktuelKurs = from a in aktiekurser 
       where a.IdDato >= idDato - 1 + antalDage 
       group a by a.IdDato into grp 
       select grp.Sum(x => x.Lukkekurs); 

Теперь у вас есть список знаков после запятой которого вы должны определить, если элементы больше, чем их предшественники и Sum результаты в соответствии с вашим правилом:

var gnsOp = aktuelKurs.Zip(aktuelKurs.Skip(1), 
       (prev,act) => act > prev ? act :0m).Sum()