2013-03-27 69 views
0

我有var變量叫做retVal,它等於某個查詢。在一些條件之後,我想將它等同於另一個查詢。但是我收到一個錯誤,如implicit cast of type "System.Collections.Generic.IEnumerable<AnonymousType#1>" in "System.Collections.Generic.IEnumerable<AnonymousType#2>" is impossible。你可以問我爲什麼我不想定義另一個var變量。因爲這個在foreach週期中使用。讓我們的代碼一看:如何將var變量等同於另一個查詢

var retVal = from groupItem in result.AsEnumerable() 
          where groupItem.Sms.First().amountOfParts == (
           (from item in rawSmsList.AsEnumerable() 
           where item.referenceNumber == groupItem.Sms.First().referenceNumber 
           select item).Count() 
          ) 
          select new 
          { 
           Value = groupItem.Value, 
           Sms = groupItem.Sms 
          }; 
       //CONDITION 
       if (retVal.ToArray().Length==0) 
       { 
        //HERE I NEED TO RETVAL EQUATE NEW QUERY 
        retVal = from groupItem in result.AsEnumerable() 
           where groupItem.Sms.First().amountOfParts == (
            (from item in rawSmsList.AsEnumerable() 
            where item.senderNumber == groupItem.Sms.First().senderNumber 
            select item).Count() 
           ) 
           select new 
           { 
            Value = groupItem.Value, 
            Sms = groupItem.Sms 
           };       
       } 

       foreach (var item in retVal)//FOREACH EXPECTS THE SAME RETVAL!!! 

因此,如何會產生不同的查詢到同一var變量?或者如何找到var變量的類型,然後將其轉換爲新的已定義變量?

回答

5

var意味着隱式類型的變量,這意味着它的類型將在編譯時確定的,因此,在您第一次使用它會被分配一個匿名類型,在你的第二個你想爲它分配一個不同的匿名類型,你可以不這樣做。

您可以修改您的代碼以使用類而不是匿名對象,然後投影到該對象,然後您將執行您現在正在執行的操作。您可以創建這樣的類:

public class MyClass 
{ 
    public int Value {get;set;} 
    public string Sms {get;set;} 
} 

,然後通過修改你的SELECT語句作爲其投影:

var retVal = ...... 
      select new MyClass 
       { 
        Value = groupItem.Value, 
        Sms = groupItem.Sms 
       }; 
+0

也許['SequenceEqual'](http://msdn.microsoft.com/zh-cn/library/bb342073.aspx)可用於比較兩個匿名類型結果的結果。 – 2013-03-27 04:36:08

+0

@JonathonReinhart,我認爲通過等同於OP意味着將新查詢的結果分配給現有的'retVal',它的一種混亂,但從代碼似乎如此 – Habib 2013-03-27 04:37:23

+0

沒有任何方法可以將一個匿名類型投給另一個? – Nolesh 2013-03-27 04:37:28

3

您正在使用您的預測匿名類看起來是一樣的我們,但他們就編譯器而言,它有兩個獨立的類,這就是爲什麼你會在錯誤中看到AnonymousType#1和AnonymousType#2的原因。

一個解決方案是簡單地選擇「groupItem」,而不是使用匿名類進行投影,因爲您只使用groupItem本身內的屬性。這會給你相同的IQueryable類型。

旁註:你應該將 「retVal.ToArray()長度== 0」 與

+0

感謝您的注意! +1 – Nolesh 2013-03-27 05:05:02

3

爲了增加Habib的答案 「retVal.Any()!」:

只需創建一個實際的類而不是使用匿名類型(每次使用它時都是不同的類)。我不知道您的示例中的類型,因此你必須指定:

public class ValueSmsThing   // Give it a better name! 
{ 
    public IDontKnow Value { get; private set; } // specify the type! 
    public SmsNumber Sms { get; private set; } // !! 

    public ValueSmsThing(IDontKnow value, SmsNumber sms) { 
     Value = value; 
     Sms = sms; 
    } 
} 

然後在您的查詢,而不是使用匿名類型:

select new 
{ 
    Value = groupItem.Value, 
    Sms = groupItem.Sms 
}; 

使用具體的類你創建

select new ValueSmsThing(groupItem.Value, groupItem.Sms); 

然後你for循環就會知道遍歷ValueSmsThing秒。

+1

+1 Jonathon,在我的回答中剛剛添加了類似的方法:) – Habib 2013-03-27 04:43:49

相關問題