2017-01-19 4 views
1
for (int i = 1; i < 31; i++) 
{ 

    var getData = "SELECT * FROM Test WHERE date = '" + inputDate + "'"; 
    sumKG = 0; 
    foreach (var c in db.Query(getData)) 
    { 
     var total = c.kg * c.rep * c.sett; 

     DateTime thisDay = c.date; 
     nextDay = thisDay.AddDays(1); 

     inputDate = nextDay.ToString("yyyy-MM-dd"); 

     sumKG += total; 
    } 
    @sumKG <br /> 
} 

Так это вычисление для каждой строки в базе данных с теми же датами, хранящихся в нем, когда цикл Еогеаспа делаются с расчетом он прыгает обратно в цикл и inputDate будет на следующий день из-за addDays(1), однако, если есть дата, которая ничего не соответствует в базе данных, она ничего не делает, я хочу, чтобы он снова добавил один день к inputDate и продолжал на следующий день каждый раз, когда нет матч до for петля делается!сделать прогон цикла Foreach пока она находит результаты

Потому что точка for loop в этом случае должна проверять данные в течение одного месяца, а когда один день равен нулю, он просто останавливается, как я могу это решить? Это имело какой-то смысл?

+1

Почему этого расчета в C# на каждый день, вместо того, чтобы использовать SQL для расчета это все в первую очередь? Если вы добавите структуру своей таблицы, некоторые примеры данных и желаемый результат, мы, вероятно, можем помочь вам создать единый оператор sql, который будет рассчитать все это для вас. –

+0

Вы должны попытаться сохранить эту логику отдельно от viewmodel. Выполняйте все ваши вычисления в контроллере и представляйте результаты в режиме просмотра. – Nikola

+0

@ ZoharPeled Я не думал об этом ха-ха, но я исправил это сейчас! Я действительно знал, как это сделать! –

ответ

1

Вы уже знаете дату, которую ищете, потому что у вас есть ее вне цикла foreach. Поэтому логика добавления дня должна выполняться вне цикла foreach.

for (int i = 1; i < 31; i++) 
{ 

var getData = "SELECT * FROM Test WHERE date = '" + inputDate.ToString("yyyy-MM-dd") + "'"; 
sumKG = 0; 

nextDay = thisDay.AddDays(1); 
inputDate = nextDay 

foreach (var c in db.Query(getData)) 
{ 
    var total = c.kg * c.rep * c.sett; 
    sumKG += total; 
} 
@sumKG <br /> 
} 

Это также является более эффективным, так как вы не сбросить переменные излишне - однако это потребует от вас сделать inputDate в DateTime, а не строка.

Или еще лучше, зачем вам 31 запрос базы данных?

К сожалению, у меня нет инструментов со мной, чтобы дать вам команду SQL, но, безусловно, можно написать команду, которая может вычислять sumKG для диапазона строк между inputDate и inputDate + 31 дня, а затем возвращать результат в формате: Grouped Date | sumKG

Если вам нравится идея о команде 1 SQL возвращающейся 31 строк итогов, то вы можете направиться в https://stackoverflow.com/questions/tagged/sql за помощью

+0

Спасибо за помощь! Я займусь этим, сделав это только одним запросом! Но это также решило мою проблему, так что это правильный ответ! –

0

Как насчет этого?

for (int i = 1; i < 31; i++) 
{ 

    var getData = "SELECT * FROM Test WHERE date = '" + inputDate + "'"; 
    sumKG = 0; 
    foreach (var c in db.Query(getData)) 
    { 
    var total = c.kg * c.rep * c.sett; 
    sumKG += total; 
    } 
    inputDate = inputDate.AddDays(1); 
    @sumKG <br /> 
} 
+0

Этот пример не будет работать, поскольку входной сигнал Pontus Date имеет строку типа. Хотя я понимаю ваш подход и хорошо выглядит ... –