if/else объявление переменной и объект не существует в текущей ошибке контекста

У меня есть следующий код, который объявляет две переменные, а затем выполняет запрос. Переменные будут созданы несмотря ни на что, поэтому я удивлен, получив object does not exist in current context error, когда запрос вот-вот будет выполнен. Как я могу сделать что-то подобное? Это случалось несколько раз. Я также пытаюсь использовать оператор if/else в объявлении переменной, но это не сработало. (Затем я получаю сообщение об ошибке invalid expression if) Что мне нужно сказать, чтобы это сработало?

        if (from_date == null) {
           var from_date_choose = DateTime.Today.AddDays(-30);
        } else { 
            var from_date_choose = from_date;
        }

        if (to_date == null) {
           var to_date_choose = DateTime.Today;
        } else {
            var to_date_choose = to_date;
        }

        var voyages = db.Voyages
       .Where(v => v.ArrivalDatetime >= from_date_choose)
       .Where(v => v.ArrivalDatetime <= to_date_choose);

person ovatsug25    schedule 26.07.2013    source источник


Ответы (4)


Измените код следующим образом, иначе ваши переменные существуют только в локальной области видимости. Вам также нужно использовать from_date.Value и to_date.Value (я предполагаю, что они имеют тип Nullable<DateTime>):

DateTime from_date_choose;
if (from_date == null) {
   from_date_choose = DateTime.Today.AddDays(-30);
} else { 
    from_date_choose = from_date.Value;
}

DateTime to_date_choose;
if (to_date == null) {
   to_date_choose = DateTime.Today;
} else {
    to_date_choose = to_date.Value;
}

var voyages = db.Voyages
.Where(v => v.ArrivalDatetime >= from_date_choose)
.Where(v => v.ArrivalDatetime <= to_date_choose);

Вы также можете использовать тернарный оператор, например:

DateTime from_date_choose = from_date == null ? DateTime.Today.AddDays(-30) : from_date.Value;

Или, как предложил Йеппе Стиг Нильсен, используйте оператор объединения, например:

DateTime from_date_choose = from_date ?? DateTime.Today.AddDays(-30);
person empi    schedule 26.07.2013
comment
Даже лучше, чем оператор ?:, это типичное использование оператора объединения null ??, поэтому DateTime from_date_choose = from_date ?? DateTime.Today.AddDays(-30);. - person Jeppe Stig Nielsen; 26.07.2013

Вы объявили from_date_choose и to_date_choose в области локальной переменной. Вы не можете получить к ним доступ там, где вы объявили voyages.

Вам нужно объявить from_date_choose и to_date_choose в той же области видимости, что и voyages, например:

DateTime from_date_choose;
if (from_date == null) {
   from_date_choose = DateTime.Today.AddDays(-30);
} else { 
    from_date_choose = from_date;
}
person Darren    schedule 26.07.2013

from_date_choose и from_date_choose объявляются внутри области действия ваших операторов if. Предложение where не имеет их в области действия. Лучше всего объявить их вверху, а затем назначить им позже. Я бы объявил их вверху и установил для них то, что вы использовали бы по умолчанию, а затем переопределил бы его, если выбранное значение не равно нулю, как это

    DateTime from_date_choose = DateTime.Today.AddDays(-30);
    DateTime to_date_choose = DateTime.Today;

    if (from_date != null) {
       var from_date_choose = from_date;
    }

    if (to_date != null) {
        var to_date_choose = to_date;
    }

    var voyages = db.Voyages
   .Where(v => v.ArrivalDatetime >= from_date_choose)
   .Where(v => v.ArrivalDatetime <= to_date_choose);
person rh072005    schedule 26.07.2013

То, что вы объявляете в операторе if, доступно только в пределах этого оператора if. Это называется областью действия переменной. измените свой метод следующим образом

  DateTime from_date_choose;
  DateTime to_date_choose;

  if (from_date == null) {
       from_date_choose = DateTime.Today.AddDays(-30);
    } else { 
       from_date_choose = from_date;
    }

    if (to_date == null) {
       to_date_choose = DateTime.Today;
    } else {
       to_date_choose = to_date;
    }

    var voyages = db.Voyages
   .Where(v => v.ArrivalDatetime >= from_date_choose)
   .Where(v => v.ArrivalDatetime <= to_date_choose);
person Ehsan    schedule 26.07.2013