2013-03-27 30 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

相关问题