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 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变量的类型,然后将其转换为新定义的变量?

4

3 回答 3

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
               };  
于 2013-03-27T04:35:01.760 回答
3

您用于投影的匿名类在我们看来是一样的,但就编译器而言,它们是两个独立的类,这就是您会在错误中看到 AnonymousType#1 和 AnonymousType#2 的原因。

一种解决方案是简单地选择“groupItem”而不是使用匿名类进行投影,因为您只使用 groupItem 本身内的属性。这将为您提供相同的 IQueryable 类型。

旁注:您应该将“retVal.ToArray().Length == 0”替换为“!retVal.Any()”

于 2013-03-27T04:40:15.273 回答
3

添加到哈比卜的答案:

只需创建一个实际的类而不是使用匿名类型(每次使用它都是一个不同的类)。我不知道您示例中的类型,因此您必须指定:

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循环将知道迭代ValueSmsThings。

于 2013-03-27T04:42:58.357 回答