2013-07-02 27 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; 
} 

但它不能正確編譯。如果我在第二個query之前添加var,它會提示該查詢已被聲明。 我是否必須更改變量名稱?諸如此類: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; 
} 

這兩個查詢是針對兩個不同的表。所以我不知道如何確定IQueryable中的類型T.此外,我select是使用new { PropertyName = propertyValue }的匿名對象。 無論如何,如果我堅持使用相同的名稱query

+0

您必須定義類型,然後在交換機之前聲明它。 –

+0

你想在switch後面使用'query'嗎? – 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: ... 
} 

現在你可以使用queryswitch之外。

注意:在某些情況下,您必須使用var,因爲您分配給它的類型沒有名稱,但在第一種情況下類型具有名稱,因此不需要使用var

編輯:但是,您的第二種情況確實需要var,因爲您選擇的是匿名類型。在情況類似,有解決這個問題的幾種方法:

  • 你可以聲明命名類型爲您選擇列「超」(即TIMETMTEMPERATURERADIATION),或
  • 在。 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回答 –