2014-10-07 28 views
1

我想根據我們傳遞什麼productID這個方法,然後添加其中,並且選擇了正確的查詢後,選擇將其改變LINQ查詢開關來改變LINQ查詢

第二個選擇是告訴我一個明確的轉換存在

我有3個問題

1)爲什麼它關心什麼第一次評估將設置planInfo來?我想如果我運行這個代碼,它將永遠不會設置planInfoLTDRatesSelected如果productID不匹配,並且第二種情況不應該需要它被轉換(我希望我有道理),因爲第一個case語句從未執行。

2)我能做些什麼來完成這項工作,或者有其他方法來完成同樣的事情?

3)我能做些什麼來初始化planInfo以外的交換機的範圍?我想它是匿名

switch (ProductId) 
{ 
     case (int)Products.LTD: 
     var planInfo = from i in context.LTDRatesSelecteds 
         select i; 
     break; 
     case (int)Products.LADD: 
     planInfo = from i in context.LADDRatesSelecteds 
        select i; 
     break; 
     case (int)Products.STD: 
     planInfo = from i in context.STDRatesSelecteds 
        select i; 
     break; 
     case (int)Products.VoluntaryLife: 
     planInfo = from i in context.VoluntaryLifeRatesSelecteds 
        select i; 
     break; 
     case (int)Products.Dental: 
     planInfo = from i in context.DentalRatesSelecteds 
        select i; 
     break; 
     case (int)Products.Vision: 
     planInfo = from i in context.VisionRatesSelecteds 
        select i; 
     break; 

} 
//planInfo.Where(i=> i.PlanCode == "somevalue" && i.Something else == "someothervalue").Select(); 
+0

'var planInfo'永遠不會被其他情況調用,所以它永遠不會被定義。你正在處理一個未定義的變量。 – Feroc 2014-10-07 13:41:04

+0

你想從表中選擇哪些列? – Magnus 2014-10-07 13:45:46

回答

2

您正在聲明planInfo變量的內部作用域,該case語句後無法訪問該變量。

清楚地看到它,你的替代開關一堆的if..else塊,你會看到它:

if (ProductId == (int)Products.LTD) 
{ 
    var planInfo = from i in context.LTDRatesSelecteds 
          select i; 
} 
else if (ProductId == (int)Products.LADD) 
{ 
    planInfo = from i in context.LADDRatesSelecteds 
          select i; 
} 

開關相當於上面的代碼,你會清楚地看到,在第二塊(else塊)planInfo不存在,它超出了該範圍。

如果您想在開關後使用planInfo,則必須在該開關之前聲明它。但是你不能把它變成一個匿名類型,因爲匿名類型必須立即分配。

您可以做的是將planInfo聲明爲IEnumerable(來自System。開關前的集合),但你將不得不丟在開關後做其中:

IEnumerable planInfo; 

switch (ProductId) 
{ 
    case (int)Products.LTD: 
      planInfo = from i in context.LTDRatesSelecteds 
        select i; 
      break; 
    case (int)Products.LADD: 
      planInfo = from i in context.LADDRatesSelecteds 
        select i; 
      break; 

    [..] 
} 

如果您詳細貴一點,你想完成我或許能幫助更多的東西。這裏的理想可能是所有類型的費率都應該從包含它們共同屬性的通用類型繼承,但我無法詳細說明如何在沒有進一步信息的情況下如何執行此操作。

+0

它不會讓我進一步查詢planInfo。例如,在滿足這些開關之一後,我將planInfo並嘗試執行諸如planInfo = planInfo.Where(i => i.something == somethingelse).Select(i => i);它抱怨IEnumerable沒有.Where()。我有一個LINQ的參考。有任何想法嗎? – reds184 2014-10-07 15:06:21

+0

我可能會誤會,但我認爲爲了能夠使用linq執行查詢,您的對象需要IEnumerable ,所以IEnumerable不足以滿足 – Kritner 2014-10-07 15:24:05

+0

似乎是正確的。我已經調整了代碼來投出每個查詢,但它仍然不會讓我使用它 – reds184 2014-10-07 16:05:06

1

正如我敢肯定,你知道,使用var planInfo = [assignment]您planInfo接收來自等號右邊的類型。

它看起來像在每個switch語句中「planInfo」表示不同的對象類型。在你的第一個開關你的planInfo被分配到類型的(比方說)IEnumerable<LTDRatesSelecteds>

第二個是IEnumerable<LADDRatesSelecteds> - 這兩種類型是不能互換的,它看起來像你的planInfo中的一切,但第一條語句永遠不會被初始化。

你在做初始任務後用planInfo做什麼?計劃信息的每個「版本」上是否發生相同的行爲?如果是這樣的話,你可能會把你的方法放入一個接口並賦值,而不是「var」。

+0

是的,我基本上會對每個版本的planInfo做同樣的事情 – reds184 2014-10-07 13:48:47

+0

+ =這是執行額外的查詢 – reds184 2014-10-07 15:28:49

1

一種方法是在每次情況下聲明變量,如果你需要它是一個外部作用域,你可以使用對象的動態關鍵字。因此,您需要非常小心,因爲沒有保證,因此您對planInfo對象做了什麼,事實上,從一次運行到下一次運行,對象將不會是相同的數據類型

dynamic planInfo; 
switch (ProductId) 
    { 
     case (int)Products.LTD: 
      planInfo = from i in context.LTDRatesSelecteds 
          select i; 
      break; 
     case (int)Products.LADD: 
      planInfo = from i in context.LADDRatesSelecteds 
         select i; 
      break; 
     case (int)Products.STD: 
      planInfo = from i in context.STDRatesSelecteds 
         select i; 
      break; 
     case (int)Products.VoluntaryLife: 
      planInfo = from i in context.VoluntaryLifeRatesSelecteds 
         select i; 
      break; 
     case (int)Products.Dental: 
      planInfo = from i in context.DentalRatesSelecteds 
         select i; 
      break; 
     case (int)Products.Vision: 
      planInfo = from i in context.VisionRatesSelecteds 
         select i; 
      break; 

    } 
+2

這將工作,但如果你以前從未與動態工作過,我會建議先讀一下它潛入其中,因爲它具有相當多的缺點以及它提供的優點。 http://msdn.microsoft.com/en-us/library/dd264736.aspx – Kritner 2014-10-07 14:05:51