2013-07-02 2 views
2

То, что я хочу, чтобы реализовать что-то вроде:Как повторно использовать переменную, объявленную «вар» в C#

switch(flag) 
{ 
    case 1: 
      var query=from w in db.someTable 
        select w; 
      break; 
    case 2: 
      query=from w in db.someTable 
        where w.id==someID 
        select w; 
      break; 
    case default: 
      break; 
} 

Но он не может правильно составить. Если я добавлю var до второго query, он предложит, чтобы запрос был объявлен. Должен ли я изменить имя переменной? Такое, как: query1 in case1, query2 in case2 и т.д.


РЕДАКЦИЯ 1 Спасибо за вашу помощь. На самом деле мой код немного сложнее, чем то, что я написал выше. Вот полный код:

List<object> results=new List<object>(); 
switch (flag) 
{ 
    case 1: 
    var query = from w in db.RADIATION 
    where w.DATEDT.CompareTo(dateStr) == 0 
    && w.LATITUDE.CompareTo(latitude) == 0 
    && w.LONGITUDE.CompareTo(longitude) == 0 
    orderby w.TIMETM 
    select new { w.RADIATION, w.TIMETM }; 
    break; 
    case 2: 
    var query = from w in db.TEMPRETURE 
    where w.DATEDT.CompareTo(dateStr) == 0 
    && w.LATITUDE.CompareTo(latitude) == 0 
    && w.LONGITUDE.CompareTo(longitude) == 0 
    orderby w.TIMETM 
    select new { w.TEMPRETURE, w.TIMETM }; 
    foreach (var item in query) 
    { 
     var resultItem = new { TEMPRETURE = item.TEMPRETURE, TIME = item.TIMETM }; 
     results.Add(resultItem); 
    } 
    break; 
    case default: 
    break; 
} 

Два запроса предназначены для двух разных таблиц. Поэтому я не знаю, как определить тип T в IQueryable. Кроме того, что я select является анонимным объектом, используя new { PropertyName = propertyValue }. В любом случае, если я настаиваю на том, чтобы использовать то же имя query?

+0

Вы должны определить тип, затем объявить его перед коммутатором. –

+0

Вы хотите использовать 'query' позже после' switch'? – tia

+0

@tia Нет, не знаю. Я знаю, что это кажется немного необоснованным, но я просто хочу использовать одно и то же имя 'query', потому что это все запросы для таблиц. – ChandlerQ

ответ

3

var ключевое слово не имеет никакого отношения. Вы можете сделать это следующим образом:

switch(flag) 
{ 
    case 1: { 
       var query=from w in db.someTable 
        select w; 
      } 
      break; 
    case 2: { 
       var query=from w in db.someTable 
        where w.id==someID 
        select w; 
      } 
      break; 
    default: 
      break; 
} 

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

+0

Прохладный, только фигурные скобки. Спасибо! – ChandlerQ

5

Объявление с var позволяет сократить код, но переменная, которую вы объявляете, остается статически типизированной, и область действия этой переменной не изменяется.

Если вам необходимо использовать переменную вне switch, объявить его до switch заявления, как это:

IQueryable<SomeType> query = null; 
switch (...) { 
    case 1: query = ...; break; 
    ... 
    default: ... 
} 

Теперь вы можете использовать query вне switch.

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

EDIT: Ваш второй случай, однако, требует var, поскольку вы выбираете анонимный тип. В подобных ситуациях, что существует несколько способов решения этой проблемы:

  • Вы можете объявить именованный тип для «надмножеству» из выбранных столбцов (т.е. TIMETM, TEMPERATURE и RADIATION), или
  • В. NET 4.0 вы можете использовать IQueryable<dynamic>. Это изменяет некоторую проверку времени компиляции во время выполнения, но если вам нужно идти по этому маршруту, это очень удобно.
+0

благодарит за вашу помощь. Я отредактировал свой вопрос, пожалуйста, прочитайте его. – ChandlerQ

+0

Если я правильно понимаю, проекция запроса отличается от коммутатора? Вы не можете этого сделать. 'var' по-прежнему компилируется в один тип, это просто синтаксический сахар, предоставленный компилятором, когда можно определить тип переменной (поэтому var = null не может быть выполнен, так как он применяется к любому объекту). Ваш первый и второй коммутаторы выбирают два разных анонимных объекта, следовательно, два разных типа объектов. Вы не можете назначить обе переменные. –

+0

Thx! Теперь я понимаю, что «var» намного лучше. Я попробую метод 'dynamic' позже. – ChandlerQ

0

, если это та же таблица, вы можете попробовать это:

var query=from w in db.someTable select w; 
switch(flag) 
{ 
    case 1: 
      break; 
    case 2: 
      query=query.Where(w.id==someID); 
      break; 
    default: 
      query=null; //since linq is Delay query, if you don't use the data in query, it will do nothing. 
      break; 
} 
+0

@Jason Из-за отложенного выполнения поведение будет выглядеть одинаково, но код не передает это так же аккуратно, как это делает код OP. – dasblinkenlight

+0

комплект запрос = null когда случай по умолчанию. : D –

+1

@ Tim.Tang Если вы это сделаете, вы больше не сможете использовать 'var'. Это было бы так же, как @dasblinkenlight ответить –