C # если еще то заявление с LINQ - PullRequest
0 голосов
/ 21 января 2012

У меня есть следующий код:

if (intval == 0)
{
    var result = (from dm in datacontext.Trk
                  where dm.ID == 0
                  select dm);
}
else
{
   var result = (from dm in datacontext.Trk
                 where dm.ID != 0
                 select dm);
}

if (result != null)
{
    // do something
}

В результате в if (result!= null) имеется резкая строка, говорящая о том, что результат имени не существует в текущем контексте.

Неуверен, как это исправить.Сначала я попытался var result = null, но C # это не понравилось.

Ответы [ 7 ]

10 голосов
/ 21 января 2012

Переменная ограничена блоком, в котором она объявлена. Таким образом, у вас есть два result s, один в if блоке и один в else блоке, которые отличаются и не видны вне их блоков.

Вам нужно определить переменную вне блоков, но тогда вам нужно быть конкретным в отношении типа, потому что компилятору C # требуется прямое выражение присваивания, чтобы вывести тип для ключевого слова var.

Однако я предлагаю переосмыслить ваш код и сделать что-то вроде следующего:

var result = from dm in datacontext.Trk
             where ((intval == 0) ? dm.ID == 0 : dm.ID != 0)
             select dm;

if (result.Any())
{
   // do something
}

Обратите также внимание, что result никогда не будет null, поэтому я заменил его на Any, но я считаю, что это не суть вопроса.

3 голосов
/ 21 января 2012

как насчет этого:

    var result = 
        intval == 0 
            ?(from dm in datacontext.Trk where dm.ID = 0 select dm) 
            :(from dm in datacontext.Trk where dm.ID != 0 select dm);

    if(results.Any())
    {
        ...
    }
3 голосов
/ 21 января 2012

Вам нужно объявить result перед оператором if:

object result = null;

if (intval = 0)
{
   result = (from dm in datacontext.Trk
                 where dm.ID = 0
                 select dm);

}
else
{
   result = (from dm in datacontext.Trk
                 where dm.ID != 0
                 select dm);


 }

 if (result != null)
 {

  // do something

 }

Или вы можете сохранить объявление var в этом другом варианте:

var result = (from dm in datacontext.Trk
                 where dm.ID != 0
                 select dm);

if (intval = 0)
{
   result = (from dm in datacontext.Trk
                 where dm.ID = 0
                 select dm);

}

if (result != null)
{
   // do something

}

Теперь вы должны как-то найтиспособ либо изменить это if, либо полностью удалить его, потому что result не может быть null в этой точке.

1 голос
/ 21 января 2012

Вы можете выполнить where отдельно от основного запроса:

var result = from dm in datacontext.Trk select dm;
if (intval == 0)
{
    result = result.Where(dm => dm.ID == 0);
}
else
{
    result = result.Where(dm => dm.ID != 0);
}

if (result.Any())
{
    // do something
}
0 голосов
/ 21 января 2012
List<TypeOfDm> dmList; // <=== Declare dmList outside of block statements.
if (intval == 0) { // <=== Use "==" for comparision, "=" is assignement.
    dmList = datacontext.Trk
        .Where(dm =>  dm.ID == 0)
        .ToList();
} else { 
    dmList = datacontext.Trk
        .Where(dm =>  dm.ID != 0)
        .ToList();
} 
if (dmList.Count != 0) { 
  // do something 
} 

Обратите внимание, с вашим кодом ваш результат всегда будет ненулевым.

0 голосов
/ 21 января 2012

Этот код также может вызвать проблемы:

if (value == 0)
{
     int result = 1;
}
else
{
     string result = "testing";
}

if (result != 1)
{
     // do something
} 

Первый результат - int, второй раз я объявляю string, а третий раз result необъявленный. Причина, по которой они могут иметь разные типы, заключается в том, что первые два объявления принадлежат разным областям. Каждый { ... } получает свою область видимости.

Если вы хотите поделиться одной переменной между областями, вам нужно объявить ее снаружи. Но теперь, поскольку во всех трех местах используется одна и та же переменная, возникает ошибка компилятора, которая не соответствует типам:

int result;

if (value == 0)
{
    result = 1;
}
else
{
    result = "testing"; // type error here
}

if (result != 1)
{
     // do something
} 
0 голосов
/ 21 января 2012

Вам необходимо объявить переменную результата перед первым if-else.

Кроме того, вам нужен паратез вокруг условия во втором операторе if.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...