C# 如何将'var'变量等同于另一个查询

C# 如何将'var'变量等同于另一个查询,c#,linq,casting,type-conversion,C#,Linq,Casting,Type Conversion,我有一个名为retVal的变量,它等于某个查询。在一些条件之后,我想将它等同于另一个查询。但是我得到了一个错误,比如System.Collections.Generic.IEnumerable中类型为System.Collections.Generic.IEnumerable的隐式转换是不可能的。你可以问我为什么不想定义另一个变量。因为这个是在foreach循环中使用的。让我们看看代码: var retVal = from groupItem in result.AsEnumerable()

我有一个名为retVal的变量,它等于某个查询。在一些条件之后,我想将它等同于另一个查询。但是我得到了一个错误,比如System.Collections.Generic.IEnumerable中类型为System.Collections.Generic.IEnumerable的隐式转换是不可能的。你可以问我为什么不想定义另一个变量。因为这个是在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变量的类型,然后将其转换为新定义的变量

意味着隐式类型变量,这意味着它的类型将在编译时确定,因此在第一次使用时,它将被分配一个匿名类型,而在第二次使用时,您试图给它分配一个不同的匿名类型,您不能这样做

您可以修改代码以使用类而不是匿名对象,然后将其投影到该类,然后您将执行您现在正在执行的操作。您可以创建如下所示的类:

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
               };  

在我们看来,用于投影的匿名类是相同的,但就编译器而言,它们是两个独立的类,这就是为什么在错误中会看到AnonymousType1和AnonymousType2

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


旁注:您应该将retVal.ToArray.Length==0替换为!返回任何要添加到Habib答案中的内容:

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

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循环将知道对值sthings进行迭代。

这里可能可以用来比较两个匿名类型结果的结果。@JonathonReinhart,我认为通过equale OP意味着将新查询的结果分配给现有的retVal,这有点令人困惑,但从代码来看,似乎没有任何方法可以将一种匿名类型转换为另一种类型?@Habib啊,是的,你是对的。阿瑞斯,你不是在等==,这意味着要检查相等性。您正在赋值=这意味着设置的值。@Ares,我不确定是否有任何方法,但您可以创建自己的类,将value和SMS作为属性,然后投影到该类。而不是使用匿名类型